-2

我有两个清单:

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

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

4

2 回答 2

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

Notemap接受一个函数和一个序列,并在应用于序列的每个成员(即 中每个子列表的第二个元素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 ]
于 2014-07-20T18:51:10.507 回答
1

匹配意味着当 l1 的子列表的第二个位置的元素与 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']]
于 2014-07-20T18:49:56.520 回答