【问题标题】:How to: Compare dictionaries within lists如何:比较列表中的字典
【发布时间】:2013-12-10 10:59:15
【问题描述】:

我想知道你是否可以帮助我。

我有两个包含字典的列表,在大多数情况下,这些键是相同的。请参阅下面的简要示例:

x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...]
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...]

现在我想比较基于键的值,即键 a,但是两个列表的长度并不总是相同的。如果存在对应的字典,即 x1[0]['a'] == x2[1]['a'],则键 a 将始终在两个字典中。

如何根据键 a 比较这些字典,以便我可以首先丢弃 x1 中未出现在 x2 中的那些字典,反之亦然。然后确定某些值是否出现在两个字典中,然后将其记录在数据库中,这里不需要。

我当时的想法是将这些字典组合成一个基于键 a 的列表中的元组。然后遍历它并比较这些值。这可能不是最好的方法,所以如果你有更好的想法,请随意。 :)

[编辑]

我没有清楚地表达这个问题,对不起。我希望做的是;首先:根据关键字 a 匹配字典。第二:忽略那些不匹配的(key a)。第三:比较键b。第四:根据b的比较更新数据库。

感谢所有回答的人。

我的答案是这样的:

“我认为列表组合可以很好地构建一个包含来自x1 的字典的元组,该字典与来自x2 的字典相对应,然后遍历每个元组比较键 b,但我认为它可能太慢了。 "

我认为这不是一个很好的方法。所以这就是我在这里的原因:)

提前谢谢你。

【问题讨论】:

  • 请描述您想要的结果。比较所有对很容易,但是应该如何处理所有这些比较的结果?
  • 如果列表不一样长会发生什么(如您所说)?
  • 你能解释一下这个说法吗? The key a will always be in both dictionaries if there is a corresponding dictionary 。你的例子不是很有帮助。
  • @Alfe 已编辑,谢谢。
  • @Abhijit 表示对应的字典并不总是存在,即 x1[n]['a'] 可能 = 57 并且 x2 没有匹配的字典,因此忽略 x1[n]。这有帮助吗?

标签: python list dictionary compare


【解决方案1】:

我不太明白你的比较,但我猜你想要的是

len(x1)==len(x2) and all(a['a']==b['a'] for (a, b) in zip(x1, x2))

或者,等效地(但效率较低),

[a['a'] for a in x1] == [b['a'] for b in x2]

【讨论】:

  • 这有点暗示并非所有dicts 都将包含密钥a,但如果其中一个包含密钥,则会这样做......所以第二个可能存在异常......
  • @JonClements 我明白了。我们可以改用[a.get('a') for a in x1] == [b.get('a') for b in x2]。如果dict 不包含密钥a,我们会在两个列表中得到两个None
【解决方案2】:

如果我理解正确,您想要的是这样的东西,它通过将两个列表转换为以“a”值作为键的字典来工作。它假定每个列表中没有“a”值的复制,并返回一个字典,其中“a”值作为键,成对的“b”元组作为值。

x1 = [{'a':1,'b':"cat"}, {'a':2,'b':"parrot"}, {'a': 3, 'b': 'dog'}]
x2 = [{'a':2,'b':"dog"}, {'a':1,'b':"fish"}]
x1_d = {d['a']: d['b'] for d in x1}
x2_d = {d['a']: d['b'] for d in x2}
matched_keys = set(x1_d) & set(x2_d)
result = {key: (x1_d[key], x2_d[key]) for key in matched_keys}
print result     # {1: ('cat', 'fish'), 2: ('parrot', 'dog')}

可能有更快的方法可以做到这一点,但也许您可以确认这是否是您正在寻找的结果。

【讨论】:

    【解决方案3】:

    如果你只是打电话

    [ a['a'] == b['a'] for a, b in zip(x1, x2) ]
    

    您将获得比较结果列表。如果列表不一样长,则较短的将决定比较的对数。

    请注意,结果将是一个布尔值列表(TrueFalse)。如果您需要其他任何内容,请更清楚地说明。

    【讨论】:

      【解决方案4】:
      x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"}]
      x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},{'a':3},{'a':2}]
      
      [(_x2,_x2['a'] in [_x1['a'] for _x1 in x1]) for _x2 in x2]
      [({'a': 2, 'b': 'dog'}, True),
       ({'a': 1, 'b': 'fish'}, True),
       ({'a': 3}, False),
       ({'a': 2}, True)]
      

      此代码在一个方向上起作用。您可以适应两个方向,或者只使用两次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 2012-02-21
        • 2017-12-20
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        相关资源
        最近更新 更多