2015-05-20 45 views
0

我寫的一些代碼的條件這樣的正常工作和做什麼,我想:Python列表理解 - for循環

#!/usr/bin/env python3 

myList = [[0], [1, 2], {'val': [3, 4, 5]}, [6]] 

flat1 = [] 
for sublist in myList: 
    if type(sublist) is list: 
     for item in sublist: 
      flat1.append(item) 
    else: 
     for item in sublist['val']: 
      flat1.append(item) 

print(flat1) 

所以它的標準嵌套列表壓扁扭曲。扭曲的是,一些嵌套的項目實際上不是列表,而是具有'val'的字典(並且我們希望在這些情況下'val'列表中的項目)。

我試圖把它變成列表理解。這裏是我試過的:

flat2 = [item for sublist in myList for item in sublist if type(sublist) is list else for item in sublist['val']] 
print(flat2) 

我得到以下錯誤,指向'其他'的插入符號。

SyntaxError: invalid syntax

是的,我寫入列表的理解看起來像廢話,毫無疑問,編譯器不知道我在做什麼。

是否有可能做我想用列表理解做什麼?

回答

3
[item 
    for sublist in myList 
    for item in (sublist if type(sublist) is list else sublist['val']) 
] 
+0

哦,當然!謝謝 – braks

1

首先,我建議不要這種方法。爲什麼你想要採取已經非常可讀的內容並將其濃縮以使其不可讀?閱讀評論

一個很好的事情後

flattened = [i for iterable in 
       (j if type(j) is list else j["val"] for j in myList) 
       for i in iterable] 

更新是打出來的清單理解爲兩個步驟:

iterables = (j if type(j) is list else j["val"] for j in myList) 
flattened = [i for iterable in iterables for i in iterable] 

這是更具可讀性 - 也不能少計算效率。注意在iterables中使用括號 - 這使得它成爲一個懶惰評估的生成器。這樣,如果myList真的很長,您仍然只讀完一次,而且在繼續之前不必等到閱讀完畢。

+1

我認爲這將是學習更難的列表理解的好機會。在我添加字典之前,它已經是一個列表理解了,所以很自然地我只想升級該行(更長的代碼就是我的工作)。我發現一般來說閱讀列表的理解很難理解,所以這沒什麼不同。我並不擔心這本書的可讀性令人震驚,因爲我可能會承認,我在那裏發表評論說它無論如何都將它列入了名單。另外,我更喜歡使用更多的代碼來接近我所看到的列表並查看0,1,2,3,4,5,6。 – braks