如何使用python将前一个列表项添加到当前列表项。
>>> l = [4,2,1,3]
如果我执行以下操作,我会得到累计金额
>>> new_l = np.cumsum(l)
但是我想在前面的第一个列表中添加当前列表,所需的输出应该是这样的。
>>> new_l
[4, 6, 3, 4]
答案 0 :(得分:2)
如果你不想使用普通的python(你最好采用矢量化方法,在大多数情况下,numpy的性能更高),你可以使用np.roll:
In[12]: np.roll(l, 1) + l
Out[12]: array([7, 6, 3, 4])
有了这个,你可以用两行简单地达到你的结果:
In [14]: new_l = np.roll(l, 1) + l
In [15]: new_l[0] = l[0]
In [16]: new_l
Out[16]: array([4, 6, 3, 4])
答案 1 :(得分:2)
如果你不介意坚持普通的python:
>>> [sum(l[max(i-1, 0):i+1]) for i in range(len(l))]
[4, 6, 3, 4]
答案 2 :(得分:1)
第一项与l
中的项目相同,然后以zip格式进行迭代。
l[:1] + [i+j for i, j in zip(l, l[1:])]
答案 3 :(得分:1)
您可以使用普通的python代码实现此目的。使用zip生成连续元素并使用列表的第一个元素保持不变
>>> l = [4,2,1,3]
>>> l[:1] + [i+j for i,j in zip(l,l[1:])]
>>> [4, 6, 3, 4]
或使用map
和lambda
>>> l[:1] + list(map(lambda x,y: x+y, l, l[1:]))
>>> [4, 6, 3, 4]
答案 4 :(得分:1)
有几种方法可以使用numpy
执行此操作:
使用np.cumsum
,减去之前的字词
l=[4,2,1,3]
c = np.cumsum(l)
c[2:] -= c[:-2]
c
Out: array([4, 6, 3, 4], dtype=int32)
使用0
填充并进行广播添加:
l = [4,2,1,3]
l_ = np.r_[0, l]
l_[1:] + l_[:-1]
Out: array([4, 6, 3, 4])
或进行boradcast添加,然后使用初始值填充
l = np.array([4,2,1,3])
np.r_[l[0], l[1:] + l[:-1]]
Out: array([4, 6, 3, 4])
对于大型数据集而言,所有这些都比列表理解要快得多
答案 5 :(得分:0)
如果您不想使用numpy,那么您可以使用zip
new_list.append(old_list[0]) # append first value
for i, j in zip(old_list, old_list[1:]): # iterate over each consecutive pair
new_list.append(i + j)
如果您正在使用大型列表,请考虑使用
itertools.izip(old_list, old_list[1:])
答案 6 :(得分:0)
这是一行中的vanilla Python实现:
l=[4,2,1,3]
new_l = [l[i] + l[i - 1] if i > 0 else l[i] for i in range(len(l))]
答案 7 :(得分:-2)
您可以使用简单的for循环
在普通python中执行此操作a = [4, 2, 1, 3]
b = []
for i in range(len(a)):
if i == 0:
b.append(a[i])
else:
b.append(a[i] + a[i-1])
print(b)
<强>输出强>
[4, 6, 3, 4]