我有两个元组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'))
(应保留顺序)
我可以抓住的最接近的参考是比较子列表并合并它们,但这适用于列表,我找不到使用元组的方法。
有没有办法执行此操作?
由于不能缺少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')]
该解决方案的优点是几乎 1 行,快速(因为字典查找)并保持顺序。
if b.get(k,v) != v
条件可防止a
有一个元组,其数字不在字典b
。在这种情况下,默认值 get
返回 v
并且条件False
如果保证列表在元组中具有相同的数字顺序,则可以执行以下操作:
[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]