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

I need to merge elements of sublist in python

我有以下数据列表

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)

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

尝试以下操作:

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

你也可以使用 numpy 的 hstack,我觉得它更直观一些

merged = np.hstack(data_to_merge)

我对比了其他答案给出的方案:

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()中的代码要小心,因为它修改了原始数据,所以你必须运行它作为最后一个;其他功能 return 一个新的副本,不要触及原件。

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

如果您确定 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]]

您可以使用运算符 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]]