Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用enumerate()进行列表元素之间的操作_Python_Python 3.x_Enumerate - Fatal编程技术网

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.Kounis
reduce
return
的单个元素,这不是我想要的think@Chris_Rands虽然你的答案解决了这个问题,我更感兴趣的是由此产生的问题,而不是实际问题。OP不想要新的列表。把它放在
enumerate(mylist,start=1)
这是一个非常普遍的例子,不幸的是我不能将它作为注释添加,所以我不得不将它作为答案发布。注意,这个解决方案将
索引器:列表分配索引超出范围
\0:尽管这个解决方案很小,但效率很低O(n²)而不是O(n)不使用enumerate#1:此解决方案创建了一个新列表,这不是问题所要问的问题#2:在此解决方案中使用n的目的是什么?这看起来很像我的第一种方法。