楔子
將python中嵌套的列表扁平化,指的就是:
lst = [1, [[[[3, 3], 5]]], [[[[[[[[[[[[[6]]]]], 8]]], "aaa"]]]], 250]]
# 類似於上面的列表,我們要得到下面的結果
[1, 3, 3, 5, 6, 8, "aaa", 250]
那么我們要如何做呢?
yield和yield from
關於如何把一個嵌套的列表扁平化,我們需要使用yield和yield from。這兩位老鐵的底層實現原理我不想深究,因為牽扯的東西太多了,況且針對目前的問題我們也用不到,這里我們簡單的說一下。
def foo():
yield [1, 2, 3]
def bar():
yield from [1, 2, 3]
print(foo().__next__()) # [1, 2, 3]
print(bar().__next__()) # 1
"""
我們看到關於yield,它是把yield后面的整個元素都迭代出來
但是對於yield from,它的后面必須跟着一個可迭代的對象,然后依次迭代這個可迭代對象里面的每一個元素
"""
因此,我們就找到了方法。
def flat(l: list):
for _ in l:
if isinstance(_, list):
yield from flat(_)
else:
yield _
lst = [1, [[[[3, 3], 5]]], [[[[[[[[[[[[[6]]]]], 8]]], "aaa"]]]], 250]]
print([_ for _ in flat(lst)]) # [1, 3, 3, 5, 6, 8, 'aaa', 250]