[Python]更加Pythonic的多個List合並和Python的安利


原題: 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....

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM