【问题标题】:What is the easiest way to search through a list of dicts in Python?在 Python 中搜索字典列表的最简单方法是什么?
【发布时间】:2011-04-24 21:00:33
【问题描述】:

我的数据库当前返回一个字典列表:

id_list = ({'id': '0c871320cf5111df87da000c29196d3d'}, 
           {'id': '2eeeb9f4cf5111df87da000c29196d3d'}, 
           {'id': '3b982384cf5111df87da000c29196d3d'}, 
           {'id': '3f6f3fcecf5111df87da000c29196d3d'}, 
           {'id': '44762370cf5111df87da000c29196d3d'}, 
           {'id': '4ba0d294cf5111df87da000c29196d3d'})

如何轻松检查给定 id 是否在此列表中?

谢谢。

【问题讨论】:

  • 那是哪个数据库?是不是可以进行查询,让数据库处理这个问题?
  • 我正在使用 MySQLdb。如果有办法返回一个简单的 ID 列表,那就太好了。我只是不知道一个!

标签: python python-datamodel


【解决方案1】:

您可以使用列表理解将其展平并用于:

id in [d['id'] for d in id_list]

您还可以使用具有不同性能特征的生成器表达式(如果您的列表很大,将使用更少的内存):

id in (d['id'] for d in id_list)

【讨论】:

  • 谢谢,哪个更高效?
  • @ensnare:第二个,一找到id就停止。但是,如果您要经常这样做,请将所有 id 放入一个集合中:ids = set(d['id'] for d in id_list),然后检查是否有 givenId in ids
  • 这真的很有帮助。谢谢。
  • 我明确遗漏了我能想到的最有效的东西(回想起来,它的效率低于@eumiro 的 set 解决方案),因为它相当模糊并且涉及到 dicts 并且问题是“最简单的”。也就是说,我不相信生成器表达式在所有情况下都是最有效的。当然在这个中,但是如果您要存储它并反复搜索它并且这很重要,那么您最好测量一下。
【解决方案2】:

这是一个单行:

if some_id in [d.get('id') for d in id_list]:
    pass

虽然效率不高。

edit -- 更好的方法可能是:

if some_id in (d.get('id') for d in id_list):
    pass

这样,列表不会事先生成完整长度。

【讨论】:

    【解决方案3】:

    如果你制作了一个搜索 id 的字典,

    search_dic = {'id': '0c871320cf5111df87da000c29196d3d'}
    
    id_list = ({'id': '0c871320cf5111df87da000c29196d3d'}, 
               {'id': '2eeeb9f4cf5111df87da000c29196d3d'}, 
               {'id': '3b982384cf5111df87da000c29196d3d'}, 
               {'id': '3f6f3fcecf5111df87da000c29196d3d'}, 
               {'id': '44762370cf5111df87da000c29196d3d'}, 
               {'id': '4ba0d294cf5111df87da000c29196d3d'})
    
    
    if search_dic in id_list:
        print 'yes'
    

    【讨论】:

    • 这真的很有帮助。谢谢。
    【解决方案4】:
    any(x.get('id')==given_id for x in id_list)
    

    。 . .返回布尔值。效率?见 S.Lott 的回答

    【讨论】:

      【解决方案5】:

      如何轻松检查给定 id 是否在此列表中?

      做一套

      keys = set( d['id'] for d in id_list )
      if some_value in keys
      

      不要问这是“高效”还是“最佳”。它涉及标准权衡。

      构建集合需要时间。但是查找是即时的。

      • 如果您进行大量查找,则构建集合的成本将在每次查找中摊销。

      • 如果您只进行少量查找,则构建集合的成本可能会高于类似的东西 {'id':some_value} in id_list.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        相关资源
        最近更新 更多