【问题标题】:Check a list of lists against another and output based on specific matches根据特定匹配检查列表列表并输出
【发布时间】:2020-07-19 04:16:45
【问题描述】:

我有两个列表。

List1 = [['X', '1', 'P'], ['D', '2', 'Y']]

List2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

注意:list2 将始终包含比 list1 更多的项目。

我想对照 List2 检查 list1 并返回列表元素 [0] 和 [1] 都相同的所有 list1 值。

所以我的最终结果应该是:

List3 = [['X', '1', 'P']] 

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: python python-3.x list-comprehension


【解决方案1】:

这里的其他答案假设 匹配 列表的顺序相同。这是一个没有的解决方案:

list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

list3 = [i for i in list1 if tuple(i[:2]) in [tuple(i[:2]) for i in list2]]
print(list3)

输出:

[['X', '1', 'P']]

为了使上述更有效,您可以将列表理解条件内的列表缓存在一个变量中

list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]

list2_tuples = set(tuple(i[:2]) for i in list2)
list3 = [i for i in list1 if tuple(i[:2]) in list2_tuples]
print(list3)

输出:

[['X', '1', 'P']]

【讨论】:

  • 您的第二个示例仍然取决于顺序相同。
  • 这是为什么呢?如果list2 的顺序颠倒了,('X', '1') 仍然是list2_tuples
  • 也许我误解了——我认为你的意思是 ['1', 'X', 'Y'] 将被视为与 ['X', '1', 'P'] 匹配
  • 是的,不是我的意思,也不是 OP 要求的。我的意思是如果List2 = [['Y', '2', 'H'], ['T', '6', 'E'], ['X', '1', 'Y']] 其他解决方案将不起作用,因为它们使用具有相同索引的元素匹配两个列表
【解决方案2】:

这将起作用:

[e1 for e2 in List2 for e1 in List1 if e1[:2] == e2[:2]]

【讨论】:

    【解决方案3】:

    一种有效地做到这一点的方法是使用您感兴趣的值的元组创建一个查找集。然后您可以进行一个简单的列表推导来过滤:

    List1 = [['X', '1', 'P'], ['D', '2', 'Y']]
    List2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]
    
    lookup = set(tuple(l[:2]) for l in List2)
    
    [l for l in List1 if tuple(l[:2]) in lookup]
    # [['X', '1', 'P']]
    

    【讨论】:

      【解决方案4】:

      使用以下代码:

      list1 = [['X', '1', 'P'], ['D', '2', 'Y']]
      list2 = [['X', '1', 'Y'], ['Y', '2', 'H'], ['T', '6', 'E']]
      similar_elements = [list1[i] for i in range(len(list1)) if list2[i][:-1]==list1[i][:-1]]
      

      【讨论】:

        【解决方案5】:
        for l1 in list1:
            for l2 in list2:
                if l1[0] == l2[0] and l1[1] == l2[1]:
                    print(l1)    # or append to list3
        

        或者,在列表理解中:

        list3 = [l1 for l1 in list1 for l2 in list2 if l1[0] == l2[0] and l1[1] == l2[1]]
        

        很简单,遍历两个列表,并检查元素 0 和 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多