【问题标题】:python: lookup in a list of dictionariespython:在字典列表中查找
【发布时间】:2021-12-14 04:54:26
【问题描述】:

我有一本字典,其中的值是字典列表:

{ 'client1':
   [
     { 'id': 123, 'name': 'test1', 'number': 777 },
     { 'id': 321, 'name': 'test2', 'number': 888 },
     { 'id': 456, 'name': 'test3', 'number': 999 }
   ],
...
}

clientX 有很多条目键。

现在,为了获取条目,例如name == test2,我遍历列表并检查 name 值,如下所示:

for l in d['client']:
   if 'test2' in l['name']:
     # process the entry
...

是否有更短/紧凑的方法来进行此类查找?

【问题讨论】:

  • 你说你想用name == test2 获取条目,但是在你写'test2' in l['name'] 的代码中这是另一回事。一是平等,二是包容。那么你真正想要获取什么?
  • 这个表达式是线性搜索最简单的表达式。在我的建议中,您可以在“if-else 子句”的末尾添加一个 break 语句以使其运行得更快
  • 这能回答你的问题吗? Python list of dictionaries search
  • 'test2' in l['name'] 也将是 true 如果 l[name]'test22' 这是不正确的
  • @nadapez,我明白了,这有很大的不同。所以in 不执行完全匹配。

标签: python python-2.7 dictionary


【解决方案1】:

您可以使用列表推导:

if "test2" in [l["name"] for l in d["client"]]:
    # process the entry

这会生成完整的名称列表供您比较,这确实将您的代码缩短了一行,同时也使其更难阅读。

【讨论】:

    【解决方案2】:

    我想你想要这样的东西。

    for v in d.values():
        item = next((x for x in v if x["name"] == "test2"), None)
        item and print("found: ", item)
    
    

    正如你在 python2 中一样,item and print("found: ", item)

    if item:
        print "found: ", item
    

    【讨论】:

    • item and print("found: ", item) 是什么?
    • 它检查项目是否不是None,然后打印该值。 and 寻找 item 如果它是 True 它会去另一边,如果是 Not True 它不会。
    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 2021-02-27
    • 2021-11-17
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多