匹配两个不同大小的列表并返回差异
我有两个列表:
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].......]
现在我想比较这两个列表,把第二个列表中没有匹配的部分提取到一个新列表里。我的意思是说,要把第一个列表的第二个元素和第二个列表的第二个元素进行比较,返回不匹配的部分。这里的“匹配”是指,当我比较第一个列表中子列表的第二个位置的元素和第二个列表中相同位置的元素时,如果它们相同就忽略掉,只有不相同的部分才要返回。实际上,我需要遍历这两个列表来进行比较。例如,在第一个列表中有3和2,比较后应该返回第二个位置元素为1的子列表。这是我的方法:
l3=[x for x in l2 if x[1] not in l1[1]]
但是它却把匹配的部分也返回给我了。这里面有什么问题呢?
2 个回答
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']]
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 ]