【问题标题】:Comparing a dictionary and a list of dictionaries Python比较字典和字典列表 Python
【发布时间】:2020-06-29 16:16:45
【问题描述】:

我是 Python 新手。

我正在尝试将字典 results 与字典列表 d 进行比较。如果它等于列表 d 中的字典(除了缺少结果“名称”键),我应该打印其中一个值(名称),如果不等于任何 - 打印不匹配。

特别是: d - 字典列表:

[OrderedDict([('name', 'Alice'), ('AAA', '2'), ('BBB', '8'), ('CCC', '3')]), OrderedDict([('name', 'Bob'), ('AAA', '4'), ('BBB', '1'), ('CCC', '5')]), 
OrderedDict([('name', 'Charlie'), ('AAA', '3'), ('BBB', '2'), ('CCC', '5')])]

结果 - 字典:

{'AAA': 4, 'BBB': 1, 'CCC': 5}

由于 results 与 dict 列表 d 的相似部分相同,我应该在该 d dict 列表中返回 'name'(在本例中为 Bob)

我正在尝试以下代码,但它似乎不起作用:

for i in range(len(d)):
    if key in d[i] != 'name':
        for k, v in results.items and d[i].items():
            if results.items() == d[i].items():
                print(d[i]['name'])
else:
    print("No match")

如果你能提供一些简单和更详细的解释,我会很高兴,因为我还没有高级:)

谢谢!

【问题讨论】:

    标签: python list dictionary compare


    【解决方案1】:

    简单易懂:

    done = False
    for di in d:
        l = list(di.values())
        l.pop(0)
        l = [int(i) for i in l]
        if l == list(results.values()):
            print(di['name'])
            done = True
    if done == False:
        print('no match found')
    

    结果字典的输出:

    Bob
    

    【讨论】:

      【解决方案2】:

      这是一个单行:

      next((x["name"] for x in d
            if results == {k: int(v) for k, v in x.items() if k != 'name'}),
           "No match")
      # Output: 'Bob'
      

      好的,所以这不是很有帮助。让我们调试您的代码。

      for k, v in results.items and d[i].items():
          if results.items() == d[i].items():
      

      您的代码中的问题是您正在比较一个键值对列表作为一个序列。无法保证常规 dict(非 OrderedDict)会以与 OrderedDict 相同的顺序为您提供.items()。相反,您可以只说(带有一点 dict-comprehension:

      if {k: int(v) for k, v in d[i].items() if k != 'name'} == result:
          print(d[i]["name"])
      

      PS:请使用稍微好一点的:for item in items: something(item) 而不是 for i in range(len(items)): something(items[i]) 构造。将它与一些列表/字典理解放在一起,您将在第一行得到答案。 :)

      【讨论】:

      • 非常感谢,这很有帮助!几个澄清的问题:1)为什么在第一段代码中使用 int(v) 而在第二段代码中不使用 int ? 2) 我现在试图将第二段代码合并到我以前的代码中,使其成为for i in range(len(d)): if results == {k: int(v) for k, v in d[i] if k != 'name'}: print(d[i]['name']) else: print("No match"),但它返回错误 ValueError: too many values to unpack (expected 2) - 为什么会这样?谢谢!
      • 1) 我应该在两者中都使用int(..)。那是因为您的 d 变量的值是字符串,而您的 result 变量的值是整数。您需要将其中一个转换为另一个。 2)这是在没有实际测试的情况下编写的。这就是为什么你看到你指出的两个问题。应该是d[i].items()
      • 已修复。我现在无法访问 Python 解释器,希望它应该可以工作:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2020-07-12
      • 2012-02-21
      相关资源
      最近更新 更多