2017-09-01 120 views
0

直到现在的,给定一个列表L元素之间的操作,我使用range(len(L))来访问它的元素:使用枚举()的列表

L = [4, 3, 5, 2, 7] 

for i in range(len(L)): 
    print(i, "-", L[i]) 

不过,我读过,这种做法是不符合Python,有一个叫enumerate功能,可以做的工作还有:

L = [4, 3, 5, 2, 7] 

for i, n in enumerate(L): 
    print(i, "-", n) 

现在,请允许我提出一个问题,以显示我已经遇到了这种方法的麻烦:

Given a list of integers L , transform the list so that every element n in the resulting list is the sum of the elements up to n in the initial list.

使用,这将是第一种方法:

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开始?
  • 在这种情况下,第二种方法实际上是否值得?
  • 如果以前的答案是“否”,它什么时候值得呢?
+5

'枚举(L,1)' – timgeb

+2

我建议为此任务使用'itertools.accumulate'或'numpy.cumsum' –

+0

这是'reduce'曾经是的.. –

回答

-1

回答到How can I make enumerate start at element 1

你做的是这样的:

L = [4, 3, 5, 2, 1] for i, n in enumerate(L, start=1):

+0

OP不希望有新列表。将它留在'枚举(mylist,start = 1)' – ivo

+0

这是一个非常普遍的例子,不幸的是我不能将它添加为注释,所以我必须将它作为答案发布。 –

+0

请注意,此解决方案会抛出一个'IndexError:列表分配索引超出范围' –

0

下面是这个特殊问题的一些解决方案:

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) 
+0

#0:尽管很小,但此解决方案效率相当低O(n2)而不是O(n)并且不使用枚举 –

+0

#1:此解决方案创建一个新列表,这不是问题的要求 –

+0

#2:在此解决方案中使用n的目的是什么?这看起来很像我的第一种方法。 –