2017-04-24 63 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 - 完成。 –

相关问题