我有两个元组a = ((1, 'AB'), (2, 'BC'), (3, 'CD'))
和b = ((1, 'AB'), (2, 'XY'), (3, 'ZA'))
。通过分析这两个元组,可以发现元组中存在不匹配,即(2, 'BC')
中存在a
,但(2, 'XY')
中存在b
。
我需要弄清楚这种不匹配,并附带一个值为
的元组result = ((2, 'BC', 'XY'), (3, 'CD', 'ZA'))
(订单应保留)
我能抓住的最接近的引用是Comparing sublists and merging them,但这是针对列表的,我找不到使用元组的方法。
有没有办法可以执行此操作?
答案 0 :(得分:5)
因为不能错过"键"从a
或b
(或应忽略这些值),我会将b
转换为字典,然后循环a
并比较值。
a = ((1, 'AB'), (2, 'BC'), (3, 'CD'))
b = ((1, 'AB'), (2, 'XY'), (3, 'ZA'))
b = dict(b)
mismatches = [(k,v,b[k]) for k,v in a if b.get(k,v) != v]
print(mismatches)
结果:
[(2, 'BC', 'XY'), (3, 'CD', 'ZA')]
该解决方案的优点是几乎一行,快速(因为dict查找)并保留顺序。
if b.get(k,v) != v
条件保护a
有一个元组,其数字不在b
字典中。在这种情况下,默认值get
会返回v
,条件为False
答案 1 :(得分:0)
如果保证列表与元组中的数字顺序相同,则可以执行以下操作:
[ai + (bi[1],) for ai, bi in zip(a, b) if ai != bi]
如果订单无法保证,您可以这样做:
[ai + (bi[1],) for ai, bi in zip(sorted(a), sorted(b)) if ai != bi]