繁体   English   中英

如何基于使用Python的两个列表元素之一的列表元素连接来连接两个列表

[英]How to join two lists based on the list element occurrence of one of the two using Python

我有以下清单

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 [0] [0]元素时,保留第一个list1并从list2添加list1元素

我尝试过以下几种组合

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

但是list3显示了常见的元素

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

让我提出一个更快更好的工作方案:

  • 每次提取的第一要素list1中的子列表set快速匹配。
  • 然后通过添加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']]

您必须使用集合并建立联合以消除重复:

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]

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

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']]

将列表附加在一起,所以

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM