比较元组列表中的几个元素

3
我有两个元组列表,按照以下顺序显示:
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)]

因此,正如您在此示例中所看到的一样,算法在比较各个元组时将完全忽略最后一个数字或第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)]) 这是显而易见的结果,因为所有元组的最后一个元素都不匹配,因此该方法预测所有这样的元组均未匹配。 编辑: 我希望保留结果中第四个元素的值,因此删除所有元组中的第四个元素并进行比较不是一个选项。
1个回答

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)]

这很完美。谢谢Martijin。 - Dhruvsito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接