我有两个清单:
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]]
但是,即使匹配的部分也会归还我。它有什么问题?
答案 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 ]