2017-08-29 42 views
3

這是一個我不能理解的普遍問題。如何將此循環的一行更改爲正常的循環?

如果我有這樣的:

somelist = [[a for a, b in zip(X, y) if b == c] for c in np.unique(y)] 

如何我寫這篇文章,作爲循環正常的多?我似乎從未做到過。

編輯:到目前爲止,我已經試過這樣:

somelist = [] 
for c in np.unique(y): 
    for x, t in zip(X, y): 
     if t == c: 
      separated.append(x) 

但我不知道這是否是正確的,因爲我沒有在我的代碼其他部分得到預期的結果。

+1

你到目前爲止嘗試過什麼? –

+0

請通過編輯將代碼添加到您的問題中。 –

回答

1

平嵌套理解了,請按照下列步驟操作:

  1. 首先創建一個空的容器:somelist = []
  2. 如果理解有if條款,把它放在右邊的0123後
  3. 然後,扁平嵌套推導出,從最內

內理解爲:

row = [] 
for a, b in zip(X, y): 
    if b == c: 
     row.append(a) 

然後,somelist無非[row for c in np.unique(y)],其中row取決於幾個因素更多。 這一個相當於:

somelist = [] 
for c in np.unique(y): 
    somelist.append(row) 

所以完整的版本是:

somelist = [] 
for c in np.unique(y): 
    row = [] 
    for a, b in zip(X, y): 
     if b == c: 
     row.append(a) 
    c.append(row) 
3

讓我知道這是否有效: 首先評估外部循環的外部列表理解。然後評估內部列表理解。

somelist = [] 
for c in np.unique(y): 
    inner_list = [] 
    for a, b in zip(X, y): 
     if b == c: 
      inner_list.append(a) 
    somelist.append(inner_list) 

somelist=[] 
for c in np.unique(y): 
    ans=[] 
    for a,b in zip(X,y): 
     if b==c: 
      ans.append(a) 
    somelist.append(ans) 
0

提供明顯的警告,對於性能和Python的原因,你不應該擴展您的列表中理解成多行循環結束後,你就在外面寫現在你看到列表理解的美妙。

+0

結果應該是列表而不是列表 – ted

+0

列表理解比嵌套'for's更快的事實並不明顯。此外,列表理解並不總是比嵌套循環更Pythonic,因爲理解往往很快變得不可讀。 –

1

這怎麼看起來像使用 「普通」 的for循環(不使用a.ka.列表理解):

somelist = [] 
for c in np.unique(y) 
    l = [] 
    for a, b in zip(X, y): 
     if b == c: 
      l.append(a) 
    somelist.append(l) 
0
somelist = [] 
for c in np.unique(y): 
    somelist.append([a for a, b in zip(X, y) if b == c]) 
1

你非常接近。你的方法的問題是你忘記了一個重要的點:列表理解的結果將是列表列表。因此,在內部循環計算出的值,需要將被追加到「主」列表somelist的臨時列表召開創建一個列表的列表:

somelist = [] 
for c in np.unique(y): 
    # create a temporary list that will holds the values computed in the 
    # inner loop. 
    sublist = [] 
    for x, t in zip(X, y): 
     if t == c: 
      sublist.append(x) 
    # after the list has been computed, add the temporary list to the main 
    # list `somelist`. That way, a list of lists is created. 
    somelist.append(sublist) 

一般的經驗法則轉換時對vanilla for循環的列表理解是,對於每個嵌套級別,您需要另一個嵌套的for循環和另一個臨時列表來保存嵌套循環中計算的值。

作爲一個告誡,一旦你開始在你的理解中獲得2-3層嵌套,你應該認真考慮將它歸爲正常循環。無論您獲得的效果如何,它都會抵消嵌套列表理解的不可靠性。請記住,"97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%"