2017-04-24 64 views
0

所以,我有一個問題,我必須採取特定的鍵和相應的值,並將它們添加到一個新的字典當且僅當滿足條件。更具體地說,我定義了一個函數pokemon_by_types(db, types)它檢查給定數據庫中的口袋妖怪的類型是否與字符串的列表中的類型匹配。如果滿足條件,如何將字典的特定鍵添加到另一個字典?

給定數據庫的格式是這樣:

sample_db = { 
"Bulbasaur": (1, "Grass", "Poison", 45, 49, 49, 45, 1, False), 
"Charmander": (4, "Fire", None, 39, 52, 43, 65, 1, False), 
"Charizard": (6, "Fire", "Flying", 78, 84, 78,100, 1, False), 
"Moltres": (146, "Fire", "Flying", 90,100, 90, 90, 1, True), 
"Crobat": (169, "Poison", "Flying", 85, 90, 80,130, 2, False), 
"Tornadus, (Incarnate Form)": (641, "Flying", None, 79,115, 70,111, 5, True), 
"Reshiram": (643, "Dragon", "Fire", 100,120,100, 90, 5, True) 
} 

正如你可以看到,索引1和2將永遠爲類型的位置。

我需要做一個函數,檢查給定的字典在上述格式,並查看是否類型(任何一個,至少需要一個if語句爲true)匹配給定的字符串列表「類型」。

如果確實匹配,我需要將這些特定的鍵和值添加到空字典中。

下面是我到目前爲止的代碼:

def pokemon_by_types(db, types): 
    tdb={} 
    for pokemon in db: 
     if ((db[pokemon])[1]) or ((db[pokemon])[2]) in types: 
      tdb.update(db) 
    return tdb 

目前,沒什麼被添加到字典「TDB」。

+0

你的情況並沒有做你認爲它在做什麼,你的意思是'如果數據庫[口袋妖怪] [1]類型或數據庫[口袋妖怪] [2]類型:'此外,你不想更新'db',因爲那會更新*整個字典。你可以做'tbd [pokemon] = db [pokemon]' –

+0

你打電話給你的方法怎麼樣? –

+0

@Robert Seaman我使用單獨的測試程序文件調用函數。 Juanpa.arrivillaga:非常感謝! – ruckarucka

回答

1

您可以使用字典理解,讓你要尋找的項目:

def pokemon_by_types(db, types): 
    return {pokemon: info for pokemon, info in db.items() if (info[1] in types or info[2] in types)} 

你的榜樣的一個問題是:if ((db[pokemon])[1]) or ((db[pokemon])[2]) in types:

這是說,如果((db[pokemon])[1])回報True或者如果((db[pokemon])[2])是在types

您必須指定每個條件:if db[pokemon][1] in types or db[pokemon][2] in types:

的另一個問題是tdb.update(db)。如果if語句評估爲True,這實際上會將所有元素添加到tdb中。

+0

你應該花時間解釋*爲什麼OPs方法是錯誤的*而不是傾倒一行。 –

+0

@ juanpa.arrivillaga - 完成。 –

相關問題