2017-09-01 168 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的目的是什麼?這看起來很像我的第一種方法。 –