当我想要找到多个具有多个键的多个相同值的词典时,如何在python中搜索词典列表?

时间:2015-12-24 16:20:18

标签: python dictionary key

例如,我有一个像这样的词典列表:

[{'name':'Mike', 'hobby':'skiing', 'job':'doctor'}, {'name':'Steve', 'hobby':'skiing', 'job':'doctor'}, {'name':'Sally', 'hobby':'chess', 'job':'teacher'} ]

我希望搜索所有与键'hobby''job'具有相同值的词典。例如'hobby':'skiing''job':'doctor'。输出应为:

[{'name':'Mike', 'hobby':'skiing', 'job':'doctor'}, {'name':'Steve', 'hobby':'skiing', 'job':'doctor'}]

我的代码看起来像这样:

name=raw_input('Name: ') 
hobby=raw_input('Hobby: ') 
job= raw_input('Job: ') 
def first_searsh(input, key): 
    out = [] 
    for item in list: 
        if item[key] == input: 
            out.append(item) 
return out

我已为所有键编写了单独的函数,如下所示:

def name_search(): 
    if name != "": 
        out_1 = first_search(name, 'name') 
    else: 
        pass 
return out_1 

我的真实词典有10个键,我不知道如何连接这些单独的搜索功能,以便输出只显示具有所有相同值的词典,而不是所有输入任何值的词典

2 个答案:

答案 0 :(得分:1)

x = [{'name':'Mike', 'hobby':'skiing', 'job':'doctor'}, {'name':'Steve', 'hobby':'skiing', 'job':'doctor'}, {'name':'Sally', 'hobby':'chess', 'job':'teacher'} ]  
hobby = 'skiing'
job = 'doctor'

result = [i for i in x if i['hobby'] == hobby and i['job'] == job]

print(result)

打印:

[{'hobby': 'skiing', 'job': 'doctor', 'name': 'Mike'},
 {'hobby': 'skiing', 'job': 'doctor', 'name': 'Steve'}]

或更通用的解决方案:

def search_for(d, lst):
    return [i for i in lst if all(i[target_key] == target_value for target_key, target_value in d.items())]

dict_to_search_for = {
    'hobby':'skiing',
    'job':'doctor'
}

lst = [{'name':'Mike', 'hobby':'skiing', 'job':'doctor'}, {'name':'Steve', 'hobby':'skiing', 'job':'doctor'}, {'name':'Sally', 'hobby':'chess', 'job':'teacher'} ]

search_for(dict_to_search_for, lst)
  • dict_to_search_for是一个包含您要匹配的键值组合的字典。

  • lst是您的清单

  • search_for将字典和列表作为参数。

  • [i for i in lst if all(i[target_key] == target_value for target_key, target_value in d.items())]list comprehension,用于收集lst中与您的键值组合all匹配的每个词典。

答案 1 :(得分:0)

可能有更多Pythonic方法可以做到这一点,但只需遍历列表以匹配键:值对工作,使用'和'指定必须满足工作和业余条件。

如果某个项目是匹配项,请将其附加到新列表中,并将Bob附加到您的叔叔身上。

lst = [{'name':'Mike', 'hobby':'skiing', 'job':'doctor'}, {'name':'Steve',     
'hobby':'skiing', 'job':'doctor'}, {'name':'Sally', 'hobby':'chess',   
'job':'teacher'} ]

lst2 = []
for item in lst:
    if item['hobby'] == 'skiing' and item['job'] == 'doctor':
       lst2.append(item)

print lst2