如何根据一个属性在Python中合并两个嵌套列表?
例如
list1 = [[1,False,True],[2,True,True],[3,True,False]]
list2 = [[1,'Mr.','child'],[2,'Ms.','child'],[3,'Mr.','adult']]
我想运行类似的东西:
merged_list = merge(list1,list2, where list1[0]==list2[0])
所以最后的输出是:
merged_list = [[1,False,True,'Mr.','child'],[2,True,True,'Ms.','child'],[3,True,False,'Mr.','adult']]
由于可扩展性,我不想使用嵌套for循环;如果我尝试将两个列表合并为1,000,000行,则需要1,000,000,000,000次迭代。
答案 0 :(得分:2)
您是否考虑过将dict作为合并它们的方式?
def list_merge(list1, list2):
d = {}
for x in list1 + list2:
d.setdefault(x[0], []).extend(x[1:])
return [[x] + y for x, y in d.items()]
答案 1 :(得分:0)
以下代码怎么样:
>>> list1 = [[1,False,True],[2,True,True],[3,True,False]]
>>> list2 = [[1,'Mr.','child'],[2,'Ms.','child'],[3,'Mr.','adult']]
>>> merge = [list([x[0]] + x[1:] + y[1:]) for x in list1 for y in list2 if x[0] == y[0]]
>>> merge
[[1, False, True, 'Mr.', 'child'], [2, True, True, 'Ms.', 'child'], [3, True, False, 'Mr.', 'adult']]
>>>
答案 2 :(得分:-1)
您可以使用枚举来比较两个列表中的元素
list1 = [[1,False,True],[2,True,True],[3,True,False]]
list2 = [[1,'Mr.','child'],[2,'Ms.','child'],[3,'Mr.','adult']]
merged=[]
for i,j in enumerate(list1):
if list2[i][0]==j[0]:
merged.append(j+ list2[i][1:])
print merged
[[1, False, True, 'Mr.', 'child'], [2, True, True, 'Ms.', 'child'], [3, True, False, 'Mr.', 'adult']]
您也可以使用zip。
merged=[]
for i, j in zip( list1,list2):
if i[0] == j[0]:
merged.append(i+j[1:])
使用任一循环表现似乎相当:
In [3]: %%timeit
...: merged=[]
...: for i,j in enumerate(list1):
...: if list2[i][0]==j[0]:
...: merged.append(j+ list2[i][1:])
...:
1000000 loops, best of 3: 1.79 µs per loop
In [4]: %%timeit
...: merged=[]
...: for i, j in zip( list1,list2):
...: if i[0] == j[0]:
...: merged.append(i+j[1:])
...:
1000000 loops, best of 3: 1.76 µs per loop
答案 3 :(得分:-1)
您可以使用defaultdict
将所有列表与相同的第一个元素合并,然后将其转换为您想要的输出结构。
from collections import defaultdict
list1 = [[1,False,True],[2,True,True],[3,True,False]]
list2 = [[1,'Mr.','child'],[2,'Ms.','child'],[3,'Mr.','adult']]
d = defaultdict(list)
for item in list1 + list2:
d[item[0]] += item[1:]
merged_list = [[k]+v for k, v in d.items()]
print merged_list
# OUTPUT: [[1, False, True, 'Mr.', 'child'], [2, True, True, 'Ms.', 'child'], [3, True, False, 'Mr.', 'adult']]
答案 4 :(得分:-1)
list1 = [[1,False,True],[2,True,True],[3,True,False]]
list2 = [[1,'Mr.','child'],[2,'Ms.','child'],[3,'Mr.','adult']]
## if the order of the items doesn't matter , and you don't
## need elements to be repeated you can do:
# res = [list(set(a+list2[i])) for i, a in enumerate(list1) if a[0] == list2[i][0]]
## otherwise you can do:
res = [list(a+list2[i][1:]) for i, a in enumerate(list1) if a[0] == list2[i][0]]
print res
<强>输出:强>
[[1, False, True, 'Mr.', 'child'], [2, True, True, 'Ms.', 'child'], [3, True, False, 'Mr.', 'adult']]