原題: https://segmentfault.com/q/1010000005904259
問題: 倘若存在 L=[ [1,2,3],[4,5,6],[7,8,9]] 這樣的列表,如何把合並成[1,2,3,4,5,6,7,8,9]呢?
最直接的方法(By:松林)
ret = [] for x in L: ret += x print(x)
使用標准庫中的itertools模塊(By:dokelung)
from itertools import chain lst = list(chain(*L))
這種方法由標准庫提供,顯然是更有效率,更加簡潔的.
注: * 操作符是起到一個參數列表解包的作用
有沒有一種更加Pythonic的方法,但又不使用標准庫?
答案是當然有,我們可以利用 List Comprehension 這個python中非常好用的技巧
myList = [x for j in L for x in j]
總結
三個解決方法中,方法1是最直接的方案, 方法2利用了已有的標准庫,一般情況有更好的效率.
方法3則是發揮Python的優點,畢竟Pythonic是每個Python程序員的目標,也是這個語言吸引人的地方.
其實發這篇文章主要是順帶安利下Python, 一段Pythonic的代碼具有很好的觀賞性, Python也提供了很多Pythonic的特性.
例如 上面提到的 LIst Comprehension 的方法來構造一個序列(列表,元組,字典), 其他語言要實現的話一般就要用lambda表達式,
個人而言是排斥lambda表達式的, 可讀性方面它不如直接定義函數,而且也缺少對稱性的優美.
再例如Python 的Slice(切片),也是一個很有用,很優美的技巧.
最經典的字符串反轉, python可以這樣寫
s = "Hello, World!" print(s[::-1]) # 具體解釋可以看python文檔,這里利用的是使步長為-1
間隔抽樣可以這樣寫
L = [1,2,3,4,5........] print(L[::3]) #3 為步進長度,可以取出1,4,7....