假设:
ListA = [1,2,3,4,5]
ListB = [10,20,30,40,50,60,70]
如何制作ListC = [11,22,33,44,55,60,70]
,C[0] = B[0] + A[0]
... C[5] = nil + B[5]
等等?在这种情况下,我不能简单地使用for循环,因为IndexError
ListB
与ListA?
相比还有两个条目
答案 0 :(得分:7)
您可以使用itertools.zip_longest(..., fillvalue=0)
:
from itertools import zip_longest
[x + y for x, y in zip_longest(ListA, ListB, fillvalue=0)]
# [11, 22, 33, 44, 55, 60, 70]
# or in python 2
from itertools import izip_longest
[x + y for x, y in izip_longest(ListA, ListB, fillvalue=0)]
# [11, 22, 33, 44, 55, 60, 70]
如果您更喜欢numpy解决方案,可以使用numpy.pad
将两个列表填充到相同的长度:
import numpy as np
def add_np(A, B):
m = max(len(A), len(B))
return np.pad(A, (0, m-len(A)), 'constant') + np.pad(B, (0, m-len(B)), 'constant')
add_np(ListA, ListB)
# array([11, 22, 33, 44, 55, 60, 70])
答案 1 :(得分:4)
因为你放了numpy
标签:
C = np.array(ListB)
C[:len(ListA)] += ListA
C
# array([11, 22, 33, 44, 55, 60, 70])
如果您事先并不知道哪个更短更长:
short, long_ = sorted([ListA, ListB], key=len)
C = np.array(long_)
C[:len(short)] += short
答案 2 :(得分:2)
您可以使用for循环,但您必须考虑列表长度的差异。添加一个if语句,检查A [5]中是否存在元素,或者其他:
`
i = 0
for i in range(len(B)):
if A[i]:
C[i] = A[i] + B[i]
else:
C[i] = B[i]
`
请记住,只要您在最长列表中运行for循环,这只会在您想要的意义上起作用。
答案 3 :(得分:2)
您可以尝试这样的事情:
首先添加正在成对的元素,然后添加其余项目:
ListA = [1,2,3,4,5]
ListB = [10,20,30,40,50,60,70]
your_data=list(map(lambda x,y:x+y,ListA,ListB))
your_data.extend(ListB[len(ListA):])
print(your_data)
输出:
[11, 22, 33, 44, 55, 60, 70]
答案 4 :(得分:1)
您可以使用zip()
执行此操作:
def zip_lists(l1, l2):
if len(l1) == len(l2):
return [x + y for x, y in zip(l1, l2)]
s, b = min(l1, l2), max(l1, l2)
rest = len(s)
return [x + y for x, y in zip(s, b)] + b[rest:]
高于逻辑:
zip()
。s
和最大的列表b
。s
的长度,即rest
。zip()
,并从较大的列表rest
添加尾随元素b
。 zip_lists()
的行为如下所示:
>>> print(zip_lists([1,2,3,4,5], [10,20,30,40,50,60,70]))
[11, 22, 33, 44, 55, 60, 70]
>>> print(zip_lists([1,2,3,4,5], [10,20,30,40,50]))
[11, 22, 33, 44, 55]
答案 5 :(得分:1)
您可以使用切片运算符。
op = sum
len_a, len_b = len(ListA), len(ListB)
min_len, max_len = min(len_a,len_b), max(len_a,len_b)
ListC = list(map(op,zip(ListA[:min_len],ListB[:min_len]))) + ListA[min_len:max_len] + ListB[min_len:max_len]
最后一行将连接两个列表的其余部分。
如果它们长度相同,那么它就不会做任何事情。
如果长度不同,则ListSmaller[min_len:max_len]
将为空列表:[]