[英]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
快速匹配。 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']]
您必须使用集合并建立联合以消除重复:
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.