查找元组中的不匹配并将它们合并到Python

时间:2017-10-12 04:47:10

标签: python compare tuples

我有两个元组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,但这是针对列表的,我找不到使用元组的方法。

有没有办法可以执行此操作?

2 个答案:

答案 0 :(得分:5)

因为不能错过"键"从ab(或应忽略这些值),我会将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]