Python代碼閱讀(第35篇):完全(深度)展開嵌套列表


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]


免責聲明!

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



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