【问题标题】:How to join two lists based on the list element occurrence of one of the two using Python如何使用Python根据两个列表之一的列表元素出现来连接两个列表
【发布时间】:2019-09-02 13:16:33
【问题描述】:

我有以下列表

list1 = [[x1,1,b1],[x2,1,b1],[x3,1,b1],[x4,1,b1]]

还有以下

list2 = [[x1,0,b1],[x5,0,b1],[x2,0,b1],[x7,0,b1]]

我不知道如何创建像

这样的最终列表
list3 = [[x1,1,b1],[x2,1,b1],[x3,1,b1],[x4,1,b1],[x5,0,b1],[x7,0,b1]]

保留第一个 list1 并将 list2 中的元素添加到 list1 仅当 list1 中不存在 list2[0][0] 元素时

我尝试了以下几种组合

for i in list1:
    for i2 in list2:
        if i[0][0] != i2[0][0]
            list3.append(i2)

但是 list3 显示的是常见的元素

【问题讨论】:

标签: python python-3.x list


【解决方案1】:

将列表附加在一起,所以

list3.append(list2)
list3.append(list1)

【讨论】:

    【解决方案2】:

    你必须使用集合和联合来消除重复:

    list1 = [[1,1,1], [1,1,2]]
    list2 = [[1,1,3], [1,1,2]]
    
    list1 = set([tuple(x) for x in list1])
    list2 = set([tuple(x) for x in list2])
    
    res = list1.union(list2)
    

    这将产生{(1, 1, 3), (1, 1, 1), (1, 1, 2)}

    并将其作为您可以执行的列表列表:[list(x) for x in res]

    【讨论】:

    • 我喜欢这个想法,我正准备提出类似的方法,但 OP 的最终结果类型是一个列表。因此,您仍然需要将最终结果转换为列表。
    • @perennial_noob 可以用[list(x) for x in res]完成
    【解决方案3】:

    您尝试的逻辑是错误的。您的双循环失败,因为在循环两个组合列表的所有元素时,差异测试 必须 在某些时候为真。

    让我提出一个更快、更有效的替代方案:

    • 提取set 中每个list1 子列表的第一个元素以进行快速匹配。
    • 然后通过添加list1list2 的过滤元素来创建新列表

    像这样:

    list1 = [['x1',1,'b1'],['x2',1,'b1'],['x3',1,'b1'],['x4',1,'b1']]
    list2 = [['x1',0,'b1'],['x5',0,'b1'],['x2',0,'b1'],['x7',0,'b1']]
    
    list_items = {l[0] for l in list1}
    
    list3 = list1 + [l for l in list2 if l[0] not in list_items]
    

    结果:

    >>> list3
    [['x1', 1, 'b1'],
     ['x2', 1, 'b1'],
     ['x3', 1, 'b1'],
     ['x4', 1, 'b1'],
     ['x5', 0, 'b1'],
     ['x7', 0, 'b1']]
    

    【讨论】:

    • 非常感谢 Jean bon nuit :)
    【解决方案4】:

    您可以使用字典来合并两个列表:

    from itertools import chain
    
    x1, x2, x3, x4, x5, x7 = 'x1', 'x2', 'x3', 'x4', 'x5', 'x7'
    b1, b2, b3 = 'b1', 'b2', 'b3'
    
    list1 = [[x1, 1, b1], [x2, 1, b1], [x3, 1, b1], [x4, 1, b1]]
    list2 = [[x1, 0, b1], [x5, 0, b1], [x2, 0, b1], [x7, 0, b1]]
    
    d = {i[0]: i for i in chain(list2, list1)}
    sorted(d.values(), key=lambda x: x[0])
    # [['x1', 1, 'b1'], ['x2', 1, 'b1'], ['x3', 1, 'b1'], ['x4', 1, 'b1'], ['x5', 0, 'b1'], ['x7', 0, 'b1']]
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2020-05-08
      • 2015-09-20
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多