基于Python中的一个属性合并两个嵌套列表

时间:2014-06-22 01:04:17

标签: python list

如何根据一个属性在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次迭代。

5 个答案:

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