【问题标题】:Matching the two list of lists of different size and return the difference匹配两个不同大小的列表并返回差值
【发布时间】:2014-07-20 18:35:20
【问题描述】:

我有两个列表:

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 的子列表中的相同位置进行比较时,它应该被忽略,并且必须返回任何不匹配的元素。实际上,我必须遍历两个列表才能获得比较元素。例如3,2 在 l1 中,经过比较,它应该返回具有第二个位置元素 1 的子列表。 这是我的方法:

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

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

【问题讨论】:

  • 不清楚你所说的“匹配”是什么意思。还有,为什么l1 是一个列表列表,而您只使用它的第一个元素(使第二个元素无关紧要)。
  • 匹配意味着当 l1 的子列表的第二个位置的元素与 l2 的子列表中的相同位置相比时,它应该被忽略并且必须返回任何不匹配的元素。实际上,我必须遍历两个列表才能获得比较元素。例如l1 中的 3,2 并且经过比较它应该返回具有第二个位置元素 1 的子列表。现在够清楚了吗??
  • 考虑改进您的问题以明确这一点。此外,具有预期输出的示例输入将非常有帮助。

标签: python list-comparison


【解决方案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']]

【讨论】:

  • 我认为 OP 想要子列表,其中列表的索引 1 确实 匹配,所以只需 [21,1,'V','W']
  • @C.B.:同意,只是忽略了它。感谢您指出这一点。
【解决方案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]]

您的方法很接近,但您想使用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 ]

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2020-07-07
    • 2019-02-08
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2014-02-26
    • 2022-06-16
    相关资源
    最近更新 更多