我现在有:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
我希望:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
简单地添加两个列表。
我可以肯定地迭代这两个列表,但我不想这样做。
最恐怖的方式是什么?
答案 0 :(得分:297)
>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]
带有列表理解的或zip
:
>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]
>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop
答案 1 :(得分:91)
其他人举例说明了如何在纯python中执行此操作。如果要对具有100.000个元素的数组执行此操作,则应使用numpy:
In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])
执行元素添加现在与
一样简单In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]
就像在Matlab中一样。
与Ashwini最快版本进行比较的时间:
In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop
In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop
所以这是一个快25倍的因素!但请根据您的情况使用。对于一个简单的程序,你可能不想安装numpy,所以使用标准的python(我发现Henry的版本是最pythonic的)。如果您正在进行严重的数字运算,请numpy
进行繁重的工作。对于速度怪胎:似乎numpy解决方案从n = 8
开始更快。
答案 2 :(得分:51)
[a + b for a, b in zip(list1, list2)]
答案 3 :(得分:8)
正如其他人所描述的那样,快速且节省空间的解决方案是使用numpy(np)及其内置的矢量处理功能:
<强> 1。使用Numpy
x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y
<强> 2。内置插件
2.1 Lambda
list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)
请注意,map()支持多个参数。
2.2 zip和list comprehension
list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]
答案 4 :(得分:6)
从我的观点来看,使用function uce_number_events_tickets() {
$count_events = wp_count_posts( $post_type = 'event' );
$count_products = wp_count_posts( $post_type = 'product' );
echo ('<div id="uce-counter">We currently have ' . '<span>' . $count_events->publish . '</span>' . ' events listed with ' . '& ' . '<span>' . $count_products->publish . '</span>' . ' tickets available to buy!</div>');
}
add_shortcode('uce_number_events_tickets', 'uce_number_events_tickets');
更简单:
numpy
结果:
有关详细参数信息,请点击此处:numpy.add
答案 5 :(得分:4)
也许“最pythonic方式”应该包括处理list1和list2的大小不同的情况。应用其中一些方法将悄然给你一个答案。 numpy方法会让你知道,很可能是一个ValueError。
示例:
import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)
如果您的问题出现在函数中,您可能想要哪个结果?
答案 6 :(得分:3)
这适用于2个或更多列表;迭代列表列表,但使用numpy加法来处理每个列表的元素
import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]
lists = [list1, list2]
list_sum = np.zeros(len(list1))
for i in lists:
list_sum += i
list_sum = list_sum.tolist()
[5.0, 7.0, 9.0]
答案 7 :(得分:3)
numpy.add()
import numpy
list1 = numpy.array([1, 2, 3])
list2 = numpy.array([4, 5, 6])
result = numpy.add(list1, list2) # result receive element-wise addition of list1 and list2
print(result)
array([5, 7, 9])
如果你想接收一个python列表:
result.tolist()
答案 8 :(得分:2)
使用带有lambda函数的map:
>>> map(lambda x, y: x + y, list1, list2)
[5, 7, 9]
答案 9 :(得分:2)
我还没有计时,但我怀疑这会非常快:
import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]
list_sum = (np.add(list1, list2)).tolist()
[5, 7, 9]
答案 10 :(得分:2)
这也许是pythonic的,如果列表数量未知且不导入任何内容,则可能会有用。
只要列表的长度相同,就可以使用以下功能。
这里* args接受可变数量的列表参数(但每个参数仅求和相同数量的元素)。
在返回的列表中再次使用*来解压缩每个列表中的元素。
def sum_lists(*args):
return list(map(sum, zip(*args)))
a = [1,2,3]
b = [1,2,3]
sum_lists(a,b)
输出:
[2, 4, 6]
或带有3个列表
sum_lists([5,5,5,5,5], [10,10,10,10,10], [4,4,4,4,4])
输出:
[19, 19, 19, 19, 19]
答案 11 :(得分:1)
[list1[i] + list2[i] for i in range(len(list1))]
答案 12 :(得分:1)
如果您需要处理不同尺寸的清单,请不要担心!精彩的itertools模块涵盖了您:
>>> from itertools import zip_longest
>>> list1 = [1,2,1]
>>> list2 = [2,1,2,3]
>>> [sum(x) for x in zip_longest(list1, list2, fillvalue=0)]
[3, 3, 3, 3]
>>>
在Python 2中,zip_longest
被称为izip_longest
。
答案 13 :(得分:1)
尽管如此,实际的问题并不想迭代列表来生成结果,但所有提出的解决方案确实完全没有做到这一点!
刷新:您无法在不查看所有矢量元素的情况下添加两个矢量。因此,大多数这些解决方案的算法复杂性是Big-O(n)。其中n是向量的维数。
因此,从算法的角度来看,使用for循环迭代生成结果列表也是逻辑和pythonic。但是,此方法不需要调用或导入任何其他库的开销。
# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]
此处显示/讨论的时序取决于系统和实现,并且不能成为衡量操作效率的可靠措施。在任何情况下,向量加法运算的大O复杂度是线性的,意味着O(n)。
答案 14 :(得分:0)
a_list = []
b_list = []
for i in range(1,100):
a_list.append(random.randint(1,100))
for i in range(1,100):
a_list.append(random.randint(101,200))
[sum(x) for x in zip(a_list , b_list )]
答案 15 :(得分:0)
v1
,v2
一起使用。v3
。v4
first = [1, 2, 3, 1]
second = [4, 5, 6]
output: [5, 7, 9, 1]
如果未知数量的相同长度的列表,则可以使用函数v5
。
v6
-运算符模块导出一组与Python的固有运算符相对应的有效函数。例如,operator.add(x, y)
等效于表达式x+y
。
v7
-假设列表first
和second
的长度相同,则无需压缩或其他任何内容。
################
first = [1, 2, 3]
second = [4, 5, 6]
####### v1 ########
third1 = [sum(i) for i in zip(first,second)]
####### v2 ########
third2 = [x + y for x, y in zip(first, second)]
####### v3 ########
lists_of_lists = [[1, 2, 3], [4, 5, 6]]
third3 = [sum(x) for x in zip(*lists_of_lists)]
####### v4 ########
from itertools import zip_longest
third4 = list(map(sum, zip_longest(first, second, fillvalue=0)))
####### v5 ########
def sum_lists(*args):
return list(map(sum, zip(*args)))
third5 = sum_lists(first, second)
####### v6 ########
import operator
third6 = list(map(operator.add, first,second))
####### v7 ########
third7 =[first[i]+second[i] for i in range(len(first))]
####### v(i) ########
print(third1) # [5, 7, 9]
print(third2) # [5, 7, 9]
print(third3) # [5, 7, 9]
print(third4) # [5, 7, 9]
print(third5) # [5, 7, 9]
print(third6) # [5, 7, 9]
print(third7) # [5, 7, 9]