给定Python中的两个列表,如何从任意索引开始,将第一个列表的k
个连续元素添加到第二个列表的k
个连续元素?标记相应k
元素块开头的索引可以从列表1到列表2不同。
l1 = [1, 2, 3, 4, 5, 6]
l2 = [1, 1, 1, 1, 1, 1]
new_l2 = [1, 1, 2+1, 3+1, 4+1, 5+1]
在此示例中,我想将k == 4
中的第二个到第五个(l1
)元素添加到k == 4
的最后l2
个元素中。我希望更改能够反映在l2
目标是让程序尽快执行(例如地图或列表理解)。
答案 0 :(得分:0)
您可以使用简单的列表理解:
def addlists(l1, l2, k):
return [l1[i]+l2[i] if i >= k else l2[i] for i in range(len(l2))]
因此:
>>> addlists(l1, l2, 2)
[1, 1, 4, 5, 6, 7]
>>> addlists(l1, l2, 4)
[1, 1, 1, 1, 6, 7]
答案 1 :(得分:0)
def add_from(l1, l2, start):
return l2[:start] + [i + j for i,j in zip(l1[start:], l2[start:])]
>>> add_from(l1, l2, 2)
[1, 1, 4, 5, 6, 7]
答案 2 :(得分:0)
如果你愿意使用numpy而不是python列表,你可能会看到这种操作的加速 - 加上代码最终变得更清晰。此代码变为:
import numpy as np
a1 = np.array([1, 2, 3, 4, 5, 6])
a2 = np.array([1, 1, 1, 1, 1, 1]) # np.ones(len(a1), dtype=int)) might be faster.
a2[-4:] += a1[2:6]
print(a2) # array([1, 1, 4, 5, 6, 7])
答案 3 :(得分:0)
如果我正确理解了规范,那就可以了:
def weird_add(l1, l2, i1, i2, k):
"""Add k elements from l1, starting at i1, to l2, starting at i2."""
for ind1, ind2 in zip(range(i1, i1+k), range(i2, i2+k)):
l2[ind2] = l2[ind2] + l1[ind1]
使用中:
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [1, 1, 1, 1, 1, 1]
>>> weird_add(l1, l2, 1, -4, 4)
>>> l2
[1, 1, 3, 4, 5, 6]
答案 4 :(得分:0)
您可以使用zip
和sum
添加list comprehension
def add_list(l1, l2, k):
return l2[:k] + [sum(i) for i in zip(l1[k:], l2[k:])]
>>>print add_list(l1, l2, 3)
[1, 1, 1, 5, 6, 7]
答案 5 :(得分:0)
除非您已经在使用Numpy,否则我建议您使用就地拼接分配功能以及一些功能映射和zip,就像现有的一些答案一样
<强>实施强>
def foo(l1, l2, i, j, k):
#from itertools import izip
l2[j:j + k] = map(sum, zip(l1[i: i +k], l2[j: j + k]))
#l2[j:j + k] = map(sum, izip(l1[i: i +k], l2[j: j + k]))
return l2
在上面的功能中
示例强>
foo(l1, l2, 1, 2, 4)
[1, 1, 3, 4, 5, 6]