天天看點

python cookbook 4.14 展開嵌套的序列

#你想将一個多層嵌套的序列展開成一個單層清單,可以寫一個yield from 語句的遞歸生成器來輕松解決這個問題
from collections import Iterable
def flatten(items,ignore_types=(str,bytes)):
    for x in items:
        if isinstance(x,Iterable) and not isinstance(x,ignore_types): #可疊代但是不是字元串和bytes對象
            yield from flatten(x)
        else:
            yield x
items = [1,2,[3,4,[5,6],7],8]
for x in flatten(items):
    print(x)
    
#上面代碼中,isinstance(x,Iterable)檢查某個元素是否是可疊代的。如果是,yield from就會傳回所有子例程的值。
#最終傳回結果就是一個沒有嵌套的簡單序列
#ignore_types和檢測語句isinstance(x,ignore_types)用來将字元串和位元組排除在可疊代對象外,防止将他們再展開成單個字元
           
python cookbook 4.14 展開嵌套的序列
items=['dave','paula',['thomas','lewis']]  #這樣字元串數組也能滿足我們的要求
for x in flatten(items):
    print(x)
           
python cookbook 4.14 展開嵌套的序列
#語句yield from 在你想在生成器中調用其他生成器作為子例程的時候非常有用。若不适用它,就必須寫額外for循環
def flatten(items,ignore_types=(str,bytes)):
    for x in items:
        if isinstance(x,Iterable) and not isinstance(x,ignore_types):
            for i in flatten(x):  #雖然改了一點點,但是yield from效果更好
                yield i
        else:
            yield x
           

繼續閱讀