2013-04-21 95 views
0

我想弄清楚如何手動枚舉列表,但我卡住,因爲我無法弄清楚如何拆分data列表。這是我到目前爲止的代碼..手動枚舉列表

enumerated_list = [] 
data = [5, 10, 15] 

for x in (data): 
    print(x) 

for i in range(len(data)): 
    enumerate_rule = (i, x) 
    enumerated_list.append(enumerate_rule) 

print(enumerated_list) 

此打印出..

5 
10 
15 
[(0, 15), (1, 15), (2, 15)] 

當我後就是[(0, 5), (1, 15), (2, 15)]。我將如何去做這件事?

+0

出於好奇,爲什麼你想用手做這個嗎? Python中至少有一個函數會產生這個輸出。 – 2013-04-21 12:55:51

+3

@DougSwain練習最有可能 – jamylak 2013-04-21 13:02:11

+1

@DougSwain Jamylak說什麼,只是想熟悉語言 – Ergo 2013-04-21 13:09:56

回答

2

由於x經過的每一個元素在`數據,在結束:

for x in (data): 
    print(x) 

x將是最後一個元素。這就是爲什麼你會得到15爲每個元組的第二個元素:

[(0, 15), (1, 15), (2, 15)] 

你只需要一個循環:

for i in range(len(data)): 
    enumerate_rule = (i, data[i]) # data[i] gets the ith element of data 
    enumerated_list.append(enumerate_rule) 
+0

感謝您的迴應,合理歡呼! – Ergo 2013-04-21 13:08:58

3

使用the enumerate() built-in

>>> list(enumerate([5, 15, 15])) 
[(0, 5), (1, 15), (2, 15)] 

您的原始代碼的錯在於你在循環使用x,然而事實上,x並不在這個循環改變,它只是從以前的循環留在你的身邊打印值。

但是,這樣做的方法是一個壞方法。解決這個問題需要通過索引進行循環,這是Python沒有設計的目的 - 它很慢並且難以閱讀。相反,我們按價值循環。內置的enumerate()是爲我們完成這項工作的,因爲這是一個相當普遍的任務。

如果你真的不想使用enumerate()(這應該只是爲目的FO學習),然後還有更好的辦法:

>>> from itertools import count 
>>> list(zip(count(), [5, 15, 15])) 
[(0, 5), (1, 15), (2, 15)] 

這裏我們使用zip(),這是Python的功能用於一次循環兩組數據。這會從每個迭代中返回第一個值的元組,然後從每個元組中返回第二個元組,等等......這給了我們與itertools.count()結合使用時所需的結果,它可以完成它在錫上所說的內容。

如果你真的覺得有必要手工創建一個列表,做事情的更Python的方式,而unpythonic是:

enumerated_list = [] 
count = 0 
for item in data: 
    enumerated_list.append((count, item)) 
    count += 1 

但是請注意,通常,人們會使用list comprehension建設像這樣的列表 - 在這種情況下,只要有人這樣做,使用早期方法之一就更有意義。這種列表製作效率低下,難以閱讀。

+3

*手動枚舉列表* ... +1總之(不要重新發明輪子) – jamylak 2013-04-21 12:54:34

1

enumerate_rule = (i, x)的問題。您每次都使用相同的值(x,列表中的最後一項)。將其更改爲enumerate_rule = (i, data[i])

1

我會用一個正常的 「for循環」 但枚舉(),這樣你就可以在循環使用的索引i:

enumerated_list=[] 
data = [5, 10, 15] 

for i,f in enumerate(data): 
    enumerated_list.append((i,f)) 
print enumerated_list 

結果:

[(0, 5), (1, 15), (2, 15)] 
+1

沒有想到這樣,但它看起來很簡單,感謝後:) – Ergo 2013-04-21 16:40:50