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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356650.html
標籤:Python
上一篇:M1配置php環境完整版(用于M1芯片的Mac中,php開發環境,比如wordpress、"或wp"、emlog pro、typecho等本地開發環境的配置)
