我目前正在尝试比较两个数据集:
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':1, 'b':2, 'c':4}
在这种情况下,我希望输出的结果类似于:
set1 = set([('c', 4), ('c',3)])
由于它们的键匹配但值不匹配。
我尝试了使用交集和差集运算符的多种推导变化,但无法得到所需的输出。
非常感谢任何帮助。
我目前正在尝试比较两个数据集:
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':1, 'b':2, 'c':4}
set1 = set([('c', 4), ('c',3)])
由于它们的键匹配但值不匹配。
我尝试了使用交集和差集运算符的多种推导变化,但无法得到所需的输出。
非常感谢任何帮助。
如果您正在使用Python 2:
dict1.viewitems() ^ dict2.viewitems()
dict1.items() ^ dict2.items()
viewitems
(Python 2) 和 items
(Python 3) 返回一个类似于集合的对象,我们可以使用插入符号运算符来计算对称差异。
dict1.viewitems().symmetric_difference(dict2.items())
在 Python 2 中会更高效一些,不是吗? - Peter Wooddict1.viewitems()
返回一个类似于集合的对象,但不是一个真正的集合对象。因此,它没有 symetric_difference
方法。 - Hai Vuset(dict1.items()).symmetric_difference(dict2.items())
是最有效的吗?我会进行一些测试。 - Peter Woodset(dict1.viewitems()).symmetric_difference(dict2.viewitems())
。 - Peter Woodset(dict1.items()).symmetric_difference(dict2.items())
在Python 2中使用iteritems
可以提高效率。
from boltons.dictutils import MultiDict
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':1, 'b':2, 'c':4}
m = MultiDict()
for k in dict1.keys():
if dict1.get(k) != dict2.get(k):
m.add(k, dict1.get(k))
m.add(k, dict2.get(k))
print m
for k in m.keys():
print k, m.getlist(k)
# OrderedMultiDict([('c', 3), ('c', 4)])
# 'c' [3, 4]
l = [(k,v,k,dict2[k]) for k,v in dict1 if k in dict2]
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':1, 'b':2, 'c':4}
set1 = set([(k, v) for k, v in dict1.items()])
set2 = set([(k, v) for k, v in dict2.items()])
diff_set = list(set1 - set2) + list(set2-set1)
print diff_set
输出:
[('c', 3), ('c', 4)]
根据Peter Wood的观察进行编辑:
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':1, 'b':2, 'c':4}
set1 = set(dict1.items())
set2 = set(dict2.items())
diff_set = set1 ^ set2
print diff_set
set(dict1.items())
等等?为什么不使用 set ^ set
? - Peter Wood for key, val in dict1.iteritems():
if key in dict2 and val != dict2[key]:
set1.add((key, val))
for key, val in dict2.iteritems():
if key in dict1 and val != dict1[key]:
set1.add((key, val))
。
for value in zip(dict1.iteritems(), dict2.iteritems()):
if(value[0] != value[1]):
tuple = value
print tuple
(('c', 3), ('c', 4))
set
并执行 symmetric_difference
操作:set(dict1.items()) ^ set(dict2.items())
编辑: 我使用 timeit
研究了Python 2的性能。
最快的方法是set(dict1.viewitems()).symmetric_difference(dict2.viewitems())
。
第二快,也是最易读的是dict1.viewitems() ^ dict2.viewitems()
最差的是我的答案set(dict1.items()) ^ set(dict2.items())
:
>>> from timeit import timeit
>>> setup = ('dict1 = {str(i): i for i in range(1000)}; '
... 'dict2 = {str(i): (i if i % 10 else i - 1) for i in range(1000)}')
>>> exec(setup)
>>> len(dict1.viewitems() ^ dict2.viewitems())
200
>>> def check(expression):
... return timeit(expression, setup, number=30000)
时间顺序,从最好到最差:
>>> check('set(dict1.viewitems()).symmetric_difference(dict2.viewitems())')
8.233164442241105
>>> check('dict1.viewitems() ^ dict2.viewitems()')
8.242523450809585
>>> check('set(dict1.viewitems()).symmetric_difference(dict2.items())')
8.651751725357371
>>> check('set(dict1.items()).symmetric_difference(dict2.items())')
8.774394999897368
>>> check('set(dict1.items()) ^ set(dict2.items())')
9.795530728021276