Python 代碼閱讀合集介紹:為什么不推薦Python初學者直接看項目源碼
本篇閱讀的代碼實現了將一個嵌套列表的所有嵌套層次完全展開,形成一個簡單的列表的功能。
本篇閱讀的代碼片段來自於30-seconds-of-python。
deep_flatten
from collections.abc import Iterable
def deep_flatten(lst):
return [a for i in lst for a in deep_flatten(i)] if isinstance(lst, Iterable) else [lst]
# EXAMPLES
deep_flatten([1, [2], [[3], 4], 5]) # [1,2,3,4,5]
deep_flatten函數接收一個嵌套列表,返回完全展開后的列表。函數使用isinstance()與collections.abc.Iterable來檢查一個元素是否可迭代(是否為list)。如果是,則在列表推導式內遞歸調用deep_flatten()函數,否則返回[lst]。
原函數:
def deep_flatten(lst):
return [a for i in lst for a in deep_flatten(i)] if isinstance(lst, Iterable) else [lst]
可以改寫成:
def deep_flatten(lst):
if isinstance(lst, Iterable):
return [a for i in lst for a in deep_flatten(i)]
else:
return [lst]
函數判斷如果lst是可迭代對象的話,就執行return [a for i in lst for a in deep_flatten(i)]。這時如果i是可迭代對象,在deep_flatten(i)中就會繼續調用該列表推導式,繼續展開嵌套的列表;如果i不是可迭代對象,在在deep_flatten(i)中就會返回[i],此時a的值就是i,在列表推導式中就會得到一個非可迭代對象的元素,解開了元素上的嵌套層。
更近一步,函數可以改寫成:
from collections.abc import Iterable
def deep_flatten(lst):
temp = []
def f(lst):
if isinstance(lst, Iterable):
for i in lst:
for a in f(i):
temp.append(a)
return []
else:
return [lst]
f(lst)
return temp
print(deep_flatten([1, [2], [[3], 4], 5])) # [1,2,3,4,5]
