2016-03-03 103 views
3

有人可以向我解釋這一點。枚舉函數

所以,我有一個列表s與數字從-1到1,我想提取列表中的某些數字的位置。

例子:

s= [-1, 0.5, 0.2, -0.9] 

z = enumerate(s) 
y1 = [] 
for i,j in z: 
    if j<=-0.8 and j>=-1: 
     k = i 
     y1.append(k) 

y2 = [] 
for i,j in z: 
    if j<=0.8 and j>=-0.8: 
     k = i 
     y2.append(k) 

我得到y1 = [0, 3]y2 = []

但是如果我定義第二enumerate

z1 = enumerate(s) 
y1 = [] 
for i,j in z1: 
    if j<=-0.8 and j>=-1: 
     k = i 
     y1.append(k) 

z2 = enumerate(s) 
y2 = [] 
for i,j in z2: 
    if j<=0.8 and j>=-0.8: 
     k = i 
     y2.append(k) 

我得到的結果y1 = [0, 3]y2 = [1, 2]

爲什麼我需要第二個enumerate

+0

也許'枚舉'是懶惰?嘗試'z = list(enumerate(s))'。 –

回答

3

enumerate返回該序列的迭代器。一旦走過,就不能再次使用:

In [1]: l = [1, 2, 3, 4, 5] 

In [2]: e = enumerate(l) 

In [3]: e 
Out[3]: <enumerate at 0x7fad7aea25e8> 

In [4]: list(e) 
Out[4]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

In [5]: list(e) 
Out[5]: [] 

你可以用一個列表把它包:

In [6]: e = list(enumerate(l)) 

In [7]: e 
Out[7]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

In [8]: list(e) 
Out[8]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

In [9]: list(e) 
Out[9]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

你也可以使用列表解析,以簡化您的解決方案:

y1 = [i for i, x in enumerate(s) if -1 <= x <= -0.8] 
y2 = [i for i, x in enumerate(s) if -0.8 <= x <= 0.8] 
+0

謝謝@soon – VlS

+0

@VlS,歡迎您!不要忘記接受提交的答案之一(綠色標記,低於職位得分),以幫助面臨同樣問題的人。 – soon

2

從python docs開始,枚舉的實現如下:

def enumerate(collection): 
    'Generates an indexed series: (0,coll[0]), (1,coll[1]) ...'  
    i = 0 
    it = iter(collection) 
    while 1: 
     yield (i, it.next()) 
     i += 1 

由於它採用「產量」,它是一臺發電機,當你通過它在線路重複一次

for i,j in z 

要僅使用一個枚舉,發電機的值轉換到一個列表存儲狀態和重用名單:

s= [-1, 0.5, 0.2, -0.9] 

z = list(enumerate(s)) 

y1 = [] 

for i,j in z: 
    if j<=-0.8 and j>=-1: 
     k = i 
     y1.append(k) 

y2 = [] 
for i,j in z: 
    if j<=0.8 and j>=-0.8: 
     k = i 
     y2.append(k) 

print(y1) 
print(y2) 

輸出:

[0, 3] 
[1, 2] 
+1

謝謝@YashBathia – VlS

2

enumerate是一個懶惰的根erator一旦被調用並遍歷完成,它就完成了。所以,我認爲這是更好的,你包括它的呼叫直接在for循環:

s= [-1, 0.5, 0.2, -0.9] 

y1 = [] 
for i,j in enumerate(s): 
    if -1 <= j <= -0.8: 
     y1.append(i) 

y2 = [] 
for i,j in enumerate(s): 
    if -0.8 <= j <= 0.8: 
     y2.append(i) 

一個側面說明:

if j<=-0.8 and j>=-1:可以通過if -1 <= j <= -0.8:

+0

謝謝@IronFist – VlS

+0

當然@VlS .. :) –

0

更換隻是爲了添加到@Yash Bathia, 概念我想枚舉的方式是,它拉鍊在一起,象這樣的索引列表:

def enumerate(some_list): 
    indices = range(len(some_list)) 
    return zip(indices, some_list) 

當然,由於迭代器不需要有len(甚至有限長度),所以實際的實現必須更多地涉及。