2013-03-07 70 views
1

我很抱歉,我不明白隱含的循環。所以我想我可以問是否有人會爲我解釋這一點。有人可以向我解釋隱含的「循環」嗎?

我 - 下煞費苦心 - 寫了下面的隱含的循環:

ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6] 
order = [1,3,5] 
ind = [list(ueberdata).index(i) for i in order] 

這給了我的東西,第一個出現的指數秩序。

ind : 0,6,11 

到目前爲止很好。現在我想展開這個例子。也許ueberdata更大。也許我現在想擁有所有的指數。我很難過。我必須以某種方式嵌套這些循環。有人可以幫我理解這個問題,解決這個問題嗎?

一些解釋(抱歉,我真的需要表達自己): 我本質上想要做的是繪製一個數據集。我有這3種類型的數據點,我想看看我的情節。現在我的數據集當然長於3 :)。我想繪製另一列,所以我需要這些索引。對不起剛纔說的,但我認爲它可能會分散我的問題。我想繪製文件中的所有數據點,而不僅僅是第一組。

+4

它們被稱爲* list comprehensions *。谷歌「列表修真教程」中提供了一些指針。 – NPE 2013-03-07 15:11:57

+2

http://docs.python.org/2.7/tutorial/datastructures。html#list-comprehensions – wRAR 2013-03-07 15:13:00

+1

不是正確答案'ind:0,6,1'? – 2013-03-07 15:15:47

回答

6

這就是所謂的「list comprehension」。

你的代碼可以變得更簡單,不知道爲什麼你要重新創建列表時,你已經擁有了它:

ind = [uberdata.index(i) for i in order] 

如果你想要更多的指標,只是讓order更長。

+0

謝謝,它似乎已經被Robᵩ糾正了。 – unwind 2013-03-07 15:17:02

2

如果你希望所有的指數,你可以做這樣的

>>> ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6] 
>>> order = [1,3,5] 
>>> [[i for i,j in enumerate(ueberdata) if j==k] for k in order] 
[[0, 4, 8], [6, 9], [1, 10]] 

如果列表中可以說是相當大的,這是更有效地創建一個幫助defaultdict

>>> from collections import defaultdict 
>>> D = defaultdict(list) 
>>> orderset = set(order) 
>>> for i,j in enumerate(ueberdata): 
... if j in orderset: 
... D[j].append(i) 
... 
>>> [D[i] for i in order] 
[[0, 4, 8], [6, 9], [1, 10]] 
+0

是的,我也是這麼讀OP的。 – DSM 2013-03-07 15:20:30

+0

對不起,我想做點別的事情。 upvoted爲您的煩惱:) – tarrasch 2013-03-07 15:32:12

1

python documentation,列表理解可以被解讀爲

「括號中包含表達式後跟一個for子句,則爲 或更多for或if子句。其結果將是從對上下文的表達式得到 一個新的列表,如果 條款它後面。」

[list(ueberdata).index(i) for i in order] 

是,從某種意義上說,類似

ind=[] 
for i in order: 
    ind.append(list(ueberdata).index(i)) 

它不取決於列表的大小,回答你的第一個問題。

爲了獲得所有的索引,我會使用一個輔助功能,像

lambda value : [x for x in range(len(ueberdata)) if ueberdata[x] == value] 
相關問題