如何将一个列表中的所有整数添加到另一个列表中的整数,并在Python中以相同的顺序使用不同的长度?

时间:2017-12-22 03:17:09

标签: python python-2.7 numpy

假设:

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 ListBListA?相比还有两个条目

6 个答案:

答案 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]将为空列表:[]