Python 如何展開巢狀的序列

2022-09-26 20:12:12 字數 1393 閱讀 3416

問題

你想將乙個多層巢狀的序列展開成乙個單層列表

解決方案

可以寫乙個包含 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

yield from flatten(x)

else:

yield x

items = [1, 2, [3, 4, [5, 6], 7], 8]

# produces 1 2 3 4 5 6 7 8

for x in flatten(items):

print(x)

在上面**中,isinstance(x, iterable)檢查某個元素是否是可迭代的。 如果是的話,yield from就會返回所有子例程的值。最終返回結果就是乙個www.cppcns.com沒有巢狀的簡單序列了。

額外的引數ignore_types和檢測語句isinstance(x, ignore_types)用來將字串和位元組排除在可迭代物件外,防止將它們再展開成單個的字元。 這樣的話字串陣列就能最終返回我們所期望的結果了。比如:

>>> items = ['d**e', 'paula', ['thomas', 'lewis']]

>>> for x in flatten(items):

... print(x)

...d**e

paula

thomas

lewis

>>>

討論語句yiel程式設計客棧d frowww.cppcns.comm在你想在生成器中呼叫其他生成器作為子例程的時候非常有用。 如果你不使用它的話,那麼就必須寫額外的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 i

else:

yield x

儘管只改了一點點,但是yield from語句看上去感覺更好,並且也使得**更簡潔清爽。

之前提到的對於字串和位元組的額外檢查是為了防止將它們再展開成單個字元。 如果還有其他你不想展開的型別,修改引數ignore_types即可。

最後要注意的一點是,yield from在涉及到基於協程和生成器的併發程式設計中扮演著更加重要的角色。

Python 巢狀列表展開

問題1 對於列表形如 list 1 1,2 3,4,5 6,7 8 9 轉化成列表 list 2 1,2,3,4,5,6,7,8,9 的問題。python實現 普通方法 list 1 1,2 3,4,5 6,7 8 9 list 2 for in list 1 list 2 print list 2...

python使用巢狀序列

列表和元組都可以存放任何型別的資料,列表可以含有其他的列表或元組,元組也可以含有其他的元組或列表。這叫巢狀序列。巢狀序列就是序列中有序列,它是組織複雜資訊的好辦法。建立巢狀序列 巢狀列表或元組的建立方法跟普通列表或元組差不多 輸入各個元素,並以逗號隔開。區別在於巢狀序列的元素可以是整個列表或元組。n...

python 將 含巢狀的 dict平鋪展開

話不多說,直接上 def prefix dict di prefix s 把字典的每個key都帶上字首prefix s param di param prefix s return return def spear dict di con s 展開dict 如果下層還是dict 需要遞迴,展開到下層...