我遇到了一个问题,我必须在考虑长度的同时添加2个列表。例如,如果list1 = [1,2]
和list2 = [3,4,5]
答案为[1+3,2+4,5]
或[4,6,5]
。
到目前为止我所拥有的是:
def addsum(list1,list2):
new_list = []
if len(list1) > len(list2):
new_list = list1[0:]+list2[0:]
我不确定如何评价这个问题,因为我是新的列表。非常感谢帮助!
答案 0 :(得分:2)
您应该在列表理解中使用fillvalue
0
来自itertools的zip_longest
:
r = [sum(i) for i in zip_longest(list1, list2, fillvalue=0)]
zip_longest
将输入列表中的元素配对(此处为list1
和list2
)。如果一个列表较小,则将较大列表的剩余元素与作为fillvalue
提供的值(我们在此处分配给0
)配对。
现在,r
等于:
print(r) # [4, 6, 5]
同样,您可以使用map
代替list-comp:
# Python 3.x
r = list(map(sum, zip_longest(list1, list2, fillvalue=0)))
# Python 2.7
r = map(sum, zip_longest(list1, list2, fillvalue=0))
并获得r
的相同结果。
答案 1 :(得分:0)
穷人的做法:
collections.Counter(string)
答案 2 :(得分:0)
我也会使用zip_longest
解决方案,但在我的代码中构建这就是我要做的事情
def addsum(list1, list2):
if len(list1) < len(list2):
list1, list2 = list2, list1
result=list(list1)
for i,x in enumerate(list2):
result[i] += x
return result
首先确保第一个列表是最长的,如果不是这样交换它们,那么制作一个最长列表的副本,最后将位置较短列表的元素添加到副本并返回< / p>
>>> addsum([1,2],[3,4,5])
[4, 6, 5]
>>>
答案 3 :(得分:0)
虽然zip_longest
更整洁,但另一种可能性是使用试错法(如果你厌倦了“ifs”),如下所示:
def addsum(list1, list2):
res = []
i = 0
while i < len(list1) or i < len(list2):
try:
res.append(list1[i]+list2[i])
except IndexError:
try: res.append(list1[i])
except IndexError: res.append(list2[i])
i += 1
return res
答案 4 :(得分:0)
zip_longest
上的文档:
创建一个聚合来自每个迭代的元素的迭代器。如果迭代的长度不均匀,则使用
fillvalue
填充缺失值。迭代继续,直到最长的可迭代用尽。
以下是代码:
from itertools import zip_longest
[x + y for x, y in zip_longest([1,2], [3,4,5], fillvalue=0)]
输出:
[4, 6, 5]