Python 使用enumerate()进行列表元素之间的操作
到目前为止,给定一个列表Python 使用enumerate()进行列表元素之间的操作,python,python-3.x,enumerate,Python,Python 3.x,Enumerate,到目前为止,给定一个列表L,我一直在使用range(len(L))访问它的元素: L = [4, 3, 5, 2, 7] for i in range(len(L)): print(i, "-", L[i]) 但是,我已经读到,这种方法不是pythonic,有一个名为enumerate的函数也可以完成这项工作: L = [4, 3, 5, 2, 7] for i, n in enumerate(L): print(i, "-", n) 现在,请允许我提出一个问题来说明我在
L
,我一直在使用range(len(L))
访问它的元素:
L = [4, 3, 5, 2, 7]
for i in range(len(L)):
print(i, "-", L[i])
但是,我已经读到,这种方法不是pythonic,有一个名为enumerate
的函数也可以完成这项工作:
L = [4, 3, 5, 2, 7]
for i, n in enumerate(L):
print(i, "-", n)
现在,请允许我提出一个问题来说明我在使用这种方法时遇到的问题:
L = [4, 3, 5, 2, 1]
for i, n in enumerate(L): #It starts at element 0!
L[i] = n + L[i - 1]
给定一个整数列表L
,变换该列表,使结果列表中的每个元素n
都是初始列表中最多n
的元素之和
使用第一种方法,即:
L = [4, 3, 5, 2, 7]
for i in range(1, len(L)):
L[i] = L[i] + L[i - 1]
尝试第二种方法时:
L = [4, 3, 5, 2, 1]
for i, n in enumerate(L): #It starts at element 0!
L[i] = n + L[i - 1]
此问题产生的问题如下:
- 如何使枚举从元素1开始
- 在这种情况下,第二种方法真的值得吗
- 如果前面的答案是“不”,那么什么时候值得呢
如何使枚举从元素1开始
您可以这样做:
L=[4,3,5,2,1]
对于枚举中的i,n(L,start=1):
以下是解决此特定问题的一些解决方案:
L = [4, 3, 5, 2, 7]
# Solution 0
print([sum(L[0:i + 1]) for i in range(len(L))])
# Solution 1
res = [0]
for i, n in enumerate(L):
res.append(res[-1] + n)
print(res[1:])
# Solution 2
for i, n in enumerate(L[1:]):
L[i + 1] = L[i + 1] + L[i]
print(L)
enumerate(L,1)
我建议使用itertools.acculate
或numpy.cumsum
来完成这项任务这是reduce
过去用于..@Ev.Kounisreduce
仅return
的单个元素,这不是我想要的think@Chris_Rands虽然你的答案解决了这个问题,我更感兴趣的是由此产生的问题,而不是实际问题。OP不想要新的列表。把它放在enumerate(mylist,start=1)
这是一个非常普遍的例子,不幸的是我不能将它作为注释添加,所以我不得不将它作为答案发布。注意,这个解决方案将索引器:列表分配索引超出范围
\0:尽管这个解决方案很小,但效率很低O(n²)而不是O(n)不使用enumerate#1:此解决方案创建了一个新列表,这不是问题所要问的问题#2:在此解决方案中使用n的目的是什么?这看起来很像我的第一种方法。