我需要在python中合并子列表的元素

时间:2019-02-09 09:44:18

标签: python list sublist

我有以下数据列表

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

我希望按照以下步骤完成列表的合并。

data = [[4,5,9,1,2,3,7], [4,7,2,3,6,8,5], [11,13,15,12,10,15,17]]

即合并data1和data2中索引0处的元素,以及data1和data 2中索引1处的元素,依此类推。

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
for i in range (0,2):
    for j in range(0,3):
        data1[i].extend(data2[j])
print(data1)

5 个答案:

答案 0 :(得分:4)

zip()用于列表理解:

data1 = [[4,5,9],[4,7,2],[11,13,15]] 
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

data = [x+y for x, y in zip(data1, data2)]
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]


如果您需要以正常循环的方式使用它,则可以在代码中摆脱一个循环(假设两个列表的长度相等):

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

for i in range(len(data1)):
    data1[i].extend(data2[i])

print(data1)
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]

答案 1 :(得分:4)

尝试以下操作:

data_to_merge = [data1,data2]
merged = [sum(ds,[]) for ds in zip(*data_to_merge)]

您还可以使用numpy的hstack,我觉得它更直观

merged = np.hstack(data_to_merge)

答案 2 :(得分:3)

如果您确定data1data2总是具有相同数量的元素(子列表),则可以按以下方式使用map

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
data = list(map(lambda x,y:x+y,data1,data2))
print(data)

输出:

[[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]

答案 3 :(得分:2)

我比较了其他答案中给出的解决方案:

def f1(original_data):
    return [
        x+y
        for x, y in zip(*original_data)]

def f2(original_data):
    return [
        sum(x, [])
        for x in zip(*original_data)]

def f3(original_data):
    data_1 = original_data[0]
    data_2 = original_data[1]

    for i in range(len(data_1)):
        data_1[i].extend(data_2[i])

    return data_1

def f4(original_data):
    return np.hstack(original_data).tolist()

时间是:

>>> import timeit
>>> timeit.timeit('f(data)', 'from __main__ import data,  f1 as f')
0.6496335420088144
>>> timeit.timeit('f(data)', 'from __main__ import data,  f2 as f')
1.1647848110005725
>>> timeit.timeit('f(data)', 'from __main__ import data,  f3 as f')
0.6762638779910048
>>> timeit.timeit('f(data)', 'from __main__ import data,  f4 as f')
8.561359490995528

对于这些简短列表,我的f1()中的版本似乎是最快的。

注意:请注意f3()中的代码,因为它会修改原始数据,因此您必须将其作为最后一个运行。其他功能将返回新副本,并且不要触摸原始副本。

一个区别是f2()中的版本适用于多个列表,而不仅仅是2个;但是比较慢f4()(使用numpy)也适用于多个列表,但是速度较慢。

答案 4 :(得分:1)

您可以使用运算符concat()和函数starmap();:

from operator import concat
from itertools import starmap

list(starmap(concat, zip(data1, data2)))
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]