在python中搜索字典列表

时间:2014-10-19 04:30:06

标签: python list dictionary

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

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

我想查找是否为任何词典

字典[ “stringa”] == “ABC”。如果是,则返回相应的字典。 我使用了“any”函数

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

但它只给出了True / False。我怎样才能获得相应的字典。

3 个答案:

答案 0 :(得分:2)

使用next()

d = next((d for d in Mylist if d['Stringa'] == 'ABC'), None)
if d is not None: # found
    print(d)

请参阅Python: find first element in a sequence that matches a predicate

答案 1 :(得分: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_dict将为None

答案 2 :(得分: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')