匹配不同大小的两个列表列表并返回差异

时间:2014-07-20 18:35:20

标签: python list-comparison

我有两个清单:

l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W].......]

现在我想比较这两个列表并从l2获取不匹配的部分到新列表。我的意思是说它应该匹配l1 [1]和字段l2 [1]并返回不匹配的列表。 匹配意味着当l1的子列表的第二个位置中的元素与l2的子列表中的相同位置相比时,它应该被忽略,并且必须返回不匹配的任何内容。实际上我必须遍历两个列表才能获得比较元素。例如l1中的3,2并且在比较时它应该返回具有第二位置元素1的子列表。 这是我的方法:

l3=[x for x in l2 if x[1] not in l1[1]]

但是,即使匹配的部分也会归还我。它有什么问题?

2 个答案:

答案 0 :(得分:1)

  

匹配表示当元素位于l1子列表的第2位时   与l2的子列表中的相同位置相比应该是   被忽略了,必须返回不匹配的东西。

请考虑在评论中添加上述语句

将您的第一个列表缩减为关键元素列表。如果您的列表相当大,请将其设置为

遍历您的第二个列表并通过使用成员资格运算符

与缩减列表进行比较来过滤它
>>> l1=[[12,3,'C','-'],[10,2,'A','-']]
>>> l2=[[8,3,'X','W'],[15,2,'Y','W'],[16,2,'X','W'],[17,3,'V','W'],[20,2,'Z','W'],[21,1,'V','W']]
>>> key = set(e[1] for e in l1)
>>> [e for e in l2 if e[1] not in key]
[[21, 1, 'V', 'W']]

答案 1 :(得分:1)

l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W]]

你的方法已接近,但你想使用map函数创建l1

中第二个元素的列表
l3=[x for x in l2 if x[1] not in map( lambda y: y[1], l1) ]

注意map接受函数和序列,并在应用于序列的每个成员(即l1中每个子列表的第二个元素)时返回函数结果列表。如果l1非常大,您可以创建一组第二个元素,这些元素将删除重复项并使成员资格检查O(1)。

l1set = set( map( lambda y: y[1], l1) )

然后l3的创建将如下所示,

l3=[x for x in l2 if x[1] not in l1set ]