【问题标题】:comparing two dictionary lists in python比较python中的两个字典列表
【发布时间】:2010-11-03 15:01:13
【问题描述】:

我有两本字典

{key1:[list_of_objects ], {key2:[list_of_objects ]}

例如

dict1 = {key1:['a', 'b', 'c', 'd' ], key2: ['f', 'g', 'h' ] }
dict2 = {key1:['a', 'b', 'c', 'd'],  key2: ['f', 'g', 'h', 'i' ] }

对于 dict1 和 dict2 中的 eack 键,我想比较列表中的项目。

即将 dict1[key1] 中的每个值与 dict2[key1] 中的相应值进行比较,依此类推。列表中的项目是对象,因此运行类似

if dict1[key1][0].some_function() = = dict2[key1][0].some_function()
     then condition

进行此比较的最快方法是什么?

【问题讨论】:

  • 你有办法做到这一点吗?一旦你这样做了,就该担心速度了。
  • 你想对dict2[key2]中的'i'做什么?在dict1中没有对应的值。
  • 不确定您到底想做什么。我假设你有一个 MyClass 类,它有一个成员函数 some_function,它计算一个可以通过 == 比较的数字(或其他可比较的)。现在,你想在每场比赛中都做些什么而不关心列表中的顺序吗?如果 dict1['key1'] = [A,B,C] 和 dict2['key1']=[B,C,A] 它应该找到任何匹配项吗? (大概没有,因为列表没有排列)。在执行某项操作之前,您是否需要匹配列表键中的所有对象?您是要遍历所有键还是只比较 key1?
  • 我猜必须对列表进行排序才能完美匹配,如果一个列表中有项目而不是另一个列表中的项目,则 if 测试应该在这些项目上失败 - 因此记录!

标签: python dictionary compare


【解决方案1】:
for key in dict1.keys():
    for a,b in zip(dict1[key],dict2[key]):
        if a.some_function() == b.some_function():
           #do something

如果您的列表很长,您可以将zipcollections 换成izip

【讨论】:

  • 这实际上可行,假设列表中的条目是有序且长度相等的。
  • @json 如果它们的长度不同,您就没有什么可比较的了。或者您是否计划在项目不同时而不是仅在它们相同时执行操作?
  • 比较相似的项目并记录那些不在这两个列表中的项目 - 但以上对我有用,我只是添加了一个检查以确保列表的长度相同。
  • @json 这个答案不假设列表中项目的顺序或其长度,甚至不假设它们是列表。所有这些假设都在do something 中。
【解决方案2】:

套装让事情变得简单:

for key in dict1.keys():
    diff = set(dict1[key]).symmetric_difference(dict2[key])
    if diff:
        print "%s: %s" % (key, diff)  # or do whatever

【讨论】:

  • 这里有两个问题。 1. 这不包括运行some_function 方法。 2.当项目相同时,OP想要做某事,而不是当它们不同时。
  • 好点。我想我对 OP 对问题的原始解释以及示例中使用字符串感到困惑。
  • 由于 OP 后来澄清顺序很重要,我不会费心更新这个基于集合的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2018-07-03
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多