如何使用Python根据两个列表中的一个列表元素的列表元素引用来连接两个列表

如何使用Python根据两个列表中的一个列表元素的列表元素引用来连接两个列表,python,python-3.x,list,Python,Python 3.x,List,我有以下清单 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元素 仅当list2[0][0]元素在li

我有以下清单

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元素 仅当list2[0][0]元素在list1中不存在时

我尝试了以下几种组合

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

但是list3显示了常用的元素

将列表附加在一起,所以

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

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

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]

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

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

  • 提取
    集合中每个
    列表1
    子列表的第一个元素,以便快速匹配
  • 然后通过添加
    list1
    list2的过滤元素来创建新列表
像这样:

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

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

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=list1+list2
应该可以。这篇文章可能会对你有所帮助。我喜欢这个想法,我想建议一种类似的方法,但OP的最终结果类型是列表。因此,您仍然需要将最终结果转换为列表。@noob可以使用
[list(x)for x in res]
非常感谢Jean bon nuit:)