【问题标题】:Search a list of dictionary in python [duplicate]在python中搜索字典列表[重复]
【发布时间】:2014-12-14 08:28:04
【问题描述】:

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

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

我想查找是否有任何字典

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

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

但它只给出真/假。如何获取对应的字典。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    使用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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        【解决方案3】:

        这是另一个选项,它可以让您更加灵活:

        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')
        

        【讨论】:

          猜你喜欢
          • 2022-11-12
          • 2021-09-03
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多