比较元组列表中的少数元素

时间:2015-09-14 11:51:44

标签: python list tuples

我有两个元组列表,如下所示:

a = [(18, 299, 70, 33), (18, 323, 70, 34), 
(18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)]

b = [(18, 223, 70, 37), (18, 299, 70, 38), 
(18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)]

我想要的是什么:

1)。我正在尝试打印b但不在a

中的元素

2)。我想比较上面列出的列表,只比较单个元组的前三个元素,而不管该元组的不匹配的最后一个元素,即373839 ....所以在上面的例子中我希望我的答案看起来像:

result = [(18,223,70,37)]

因此,在这种情况下,您可以看到算法在比较单个元组时完全忽略最后一个数字或第四个元素。因此,我希望如果元组的前三个元素匹配,那么即使第四个元素可能相同也可能不相同,它可以预测没有差异。

我尝试了什么:

除了搜索解决方案,我只想尝试set(b_value)-set(a_value)方法。但我知道它不会起作用,因为这样产生的结果如下:

set([(18, 613, 70, 42), (18, 448, 70, 40), (18, 548, 70, 41), (18, 299, 70, 38), (18, 323, 70, 39), (18, 223, 70, 37)])

这是非常明显的结果,因为所有元组的最后一个元素都不匹配,因此这个方法预测所有这些元组都是不匹配的。

修改 我想在结果中保留第4个元素的值,因此删除所有元组中的所有第4个元素并进行比较不是一个选项。

1 个答案:

答案 0 :(得分:2)

为包含没有最后一个元素的元组的第一个列表生成一个集合;你可以在b上进行第二次循环,以收集第一个元素不在集合中的那些:

a_set = {t[:-1] for t in a}
result = [t for t in b if t[:-1] not in a_set]

从算法上讲,这与将两者转换为集合并产生集合差异的工作量相同。

演示:

>>> a = [(18, 299, 70, 33), (18, 323, 70, 34), 
... (18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)]
>>> b = [(18, 223, 70, 37), (18, 299, 70, 38), 
... (18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)]
>>> a_set = {t[:-1] for t in a}
>>> [t for t in b if t[:-1] not in a_set]
[(18, 223, 70, 37)]