2014-10-19 106 views
1

我有一个字典列表,我想查找一个值是否在列表中存在,如果存在则返回字典。 例如搜索python中的字典列表

Mylist= [{'Stringa': "ABC", 
      'Stringb': "DE", 
      'val': 5}, 
      {'Stringa': "DEF", 
      'Stringb': "GHI", 
      'val': 6}] 

我想以发现任何字典

的dict [ “stringa”] == “ABC”。如果是,则返回相应的字典。 我使用的功能“任何”

any(d['Stringa'] == 'ABC' for d in Mylist) 

,但它只是给真/假。我怎样才能得到相应的字典。

回答

1

any将只检查迭代中的任何项目是否满足条件。它不能用于检索匹配的项目。

使用列表理解来获得相匹配的项目清单,这样

matches = [d for d in Mylist if d['Stringa'] == 'ABC'] 

这将在字典中的列表循环,每当找到一个匹配,这将包括在结果列表中。然后,您可以使用列表中的索引访问实际词典,如matches[0]

或者,您可以用生成器表达式,像这样

matches = (d for d in Mylist if d['Stringa'] == 'ABC') 

,你可以从列表中获取下一个匹配的项目,与

actual_dict = next(matches) 

这会给你的实际字典。如果您想获得下一个匹配项目,可以再次使用生成器表达式调用next。如果你想获得的所有匹配项一次,作为一个列表,你可以简单地做

list_of_matches = list(matches) 

注:调用next()将引发异常,如果没有从发电机获取更多项目。所以,你可以传递一个默认值来返回。

actual_dict = next(matches, None) 

现在,actual_dictNone如果发电机被耗尽。

1

这里是另一种选择,它可以让你多一点灵活性:

def search_things(haystack, needle, value): 
    for i in haystack: 
     if i.get(needle) == value: 
     return i 
    return None # Not needed, None is returned by default 
       # you can use this to return some other default value 

found = search_things(MyList, 'StringA', 'ABC') 
if found: 
    print('Found it! {}'.format(found)) 
else: 
    print('Not found')