Python:嵌套列表合并,在同一索引中添加int

问题描述 投票:1回答:8

我只想添加两个列表,如下所示。我不必使用嵌套列表,但可以将其更改为numpy数组。请告诉我。谢谢!

input
lst1 = [[1,0,1],[1,0,0],[0,1,0]]
lst2 = [[0,1,0],[1,0,1],[1,0,1]]

output
lst = [[1,1,1],[2,0,1],[1,1,1]]

我试图添加简单的“+”或合并,但似乎它不会像Pandas DataFrame一样工作,你可以用'+'做同样的功能。我不愿意使用DataFrame,但是将其简化为列表或数组。

如果这可以在不使用循环的情况下完成,那将是完美的!

python arrays list numpy dataframe
8个回答
5
投票

随着numpy:

np.add(lst1, lst2).tolist()

# [[1, 1, 1], [2, 0, 1], [1, 1, 1]]

如果你想要它快速并且可以使用numpy数组而不是列表列表,则省略.tolist()

np.add(lst1, lst2)

# array([[1, 1, 1],
#        [2, 0, 1],
#        [1, 1, 1]])

只要您的列表列表全部转换为数组,您只需编写+,如果两个术语中的一个是数组,它就足够了:

lst1 + np.array(lst2)

# array([[1, 1, 1],
#        [2, 0, 1],
#        [1, 1, 1]])

3
投票

深层次两级=双重理解! :)

[[x + y for x, y in zip(sublst1, sublst2)] for sublst1, sublst2 in zip(lst1, lst2)]

编辑:或者更短(感谢Stefan Pochmann):

[[x + y for x, y in zip(*sublists)] for sublists in zip(lst1, lst2)]

3
投票

你一直在问,你可以更快地做到没有循环吗?你做过任何时间吗?

In [225]: lst1 = [[1,0,1],[1,0,0],[0,1,0]]
     ...: lst2 = [[0,1,0],[1,0,1],[1,0,1]]
     ...: 
In [226]: np.add(lst1,lst2).tolist()
Out[226]: [[1, 1, 1], [2, 0, 1], [1, 1, 1]]

In [227]: timeit np.add(lst1,lst2).tolist()
12 µs ± 20.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [228]: [[i+j for i,j in zip(a,b)] for a,b in zip(lst1,lst2)]
Out[228]: [[1, 1, 1], [2, 0, 1], [1, 1, 1]]
In [229]: timeit [[i+j for i,j in zip(a,b)] for a,b in zip(lst1,lst2)]
4.88 µs ± 1.05 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

对于此示例,循环版本比阵列版本快。那是因为从列表中创建数组需要时间。在进行添加之前,np.add必须将列表参数转换为数组。

纯阵列版本:

In [230]: %%timeit a,b = np.array(lst1), np.array(lst2)
     ...: np.add(a,b)
     ...: 
794 ns ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

对于更大的列表,相对时间可能会有所不同 - 但是当我过去测试过这种情况时,列表操作对于相当大的范围仍然更快。


1
投票
lst1 = [[1,0,1],[1,0,0],[0,1,0]]
lst2 = [[0,1,0],[1,0,1],[1,0,1]]

result = []
for l1, l2 in zip(lst1, lst2):
    result.append([x+y for x,y in zip(l1,l2)])

print(result)

1
投票

您可以创建自己的函数,如下所示:

def list_add(list1, list2):
    res_list = []
    for each_item1, each_item2 in zip(list1, list2):
        new_list = []
        for each_ele1, each_ele2 in zip(each_item1, each_item2):
            new_list.append(each_ele1 + each_ele2)
        res_list.append(new_list)
    return res_list

lst1 = [[1,0,1],[1,0,0],[0,1,0]]
lst2 = [[0,1,0],[1,0,1],[1,0,1]]

print(list_add(lst1, lst2))

输出:

[[1, 1, 1], [2, 0, 1], [1, 1, 1]]

1
投票

嵌套的lambda(map(...)不需要循环:

lst1 = [[1,0,1],[1,0,0],[0,1,0]]
lst2 = [[0,1,0],[1,0,1],[1,0,1]]

result = list(map(lambda x: list(map(lambda y: y[0] + y[1], zip(*x))), zip(lst1, lst2)))

print(result)
# [[1, 1, 1], [2, 0, 1], [1, 1, 1]]

虽然与@Amaden建议的列表理解相比,它要慢得多:

In [1]: lst1 = [[1,0,1],[1,0,0],[0,1,0]]

In [2]: lst2 = [[0,1,0],[1,0,1],[1,0,1]]

In [3]: timeit list(map(lambda x: list(map(lambda y: y[0] + y[1], zip(*x))), zip(lst1, lst2)))
100000 loops, best of 3: 5.78 µs per loop

In [4]: timeit [[x + y for x, y in zip(*sublists)] for sublists in zip(lst1, lst2)
100000 loops, best of 3: 2.92 µs per loop

1
投票

虽然它已经被回答了,但是我在numpy的帮助下就像下面那样做了

import numpy as np
list1=[[1,0,1],[1,0,0],[0,1,0]]
list2 = [[0,1,0],[1,0,1],[1,0,1]]

arr1=np.array((list1)) #Convert list to 2darray
arr2=np.array((list2)) #convert list to 2d array 

arr1+arr2   # simply adds the 2d array

输出:

array([[1, 1, 1],
       [2, 0, 1],
       [1, 1, 1]])

1
投票

如果你想要一行,你也可以试试这个:

lst1 = [[1,0,1],[1,0,0],[0,1,0]]
lst2 = [[0,1,0],[1,0,1],[1,0,1]]

print(list(map(lambda x,y:(list(map(lambda y,z:(y+z),x,y))),lst1,lst2)))

输出:

[[1, 1, 1], [2, 0, 1], [1, 1, 1]]
© www.soinside.com 2019 - 2024. All rights reserved.