我有两个元组列表,如下所示:
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)。我想以这样的方式比较上面显示的列表,即只比较单个元组的前三个元素,而不管该元组的最后一个元素是否不匹配,即
37
、 38
、 39
.... 所以在上述情况下,我想要我的答案看起来像:result = [(18,223,70,37)]
因此,正如您在这种情况下所看到的,算法在比较单个元组时将完全忽略最后一个数字或第 4 个元素。因此,我希望如果元组的前三个元素匹配,那么即使第四个元素可能相同也可能不同,它也可以预测没有区别。
我试过的:
除了搜索解决方案,我只想尝试
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 个元素并进行比较不是一种选择。
最佳答案
为第一个列表生成一个包含没有最后一个元素的元组的集合;您可以对 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)]
关于python - 比较元组列表中的几个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32564117/