添加特定范围内的列表

时间:2015-03-23 17:14:04

标签: python list

给定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

目标是让程序尽快执行(例如地图或列表理解)。

6 个答案:

答案 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)

您可以使用zipsum添加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

在上面的功能中

  • i - 开始第一个列表的索引
  • j - 开始第二个列表的索引
  • l1,l2 - 个人名单
  • k - 变化的长度

示例

foo(l1, l2, 1, 2, 4)
[1, 1, 3, 4, 5, 6]