亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Python中扁平化任意嵌套列表的最快方法是什么?

在Python中扁平化任意嵌套列表的最快方法是什么?

Helenr 2019-10-19 17:07:22
編輯:問題不是如何執行-這已經在其他問題中進行了討論 -問題是,哪種方法最快?我之前已經找到了解決方案,但是我想知道最快的解決方案是將包含其他任意長度列表的列表展平。例如:[1, 2, [3, 4, [5],[]], [6]]會成為:[1,2,3,4,5,6]可以有無限多個級別。一些列表對象可以是字符串,不能在輸出列表中將其展平為它們的順序字符。
查看完整描述

3 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

這是一種字符串友好的遞歸方法:


nests = [1, 2, [3, 4, [5],['hi']], [6, [[[7, 'hello']]]]]


def flatten(container):

    for i in container:

        if isinstance(i, (list,tuple)):

            for j in flatten(i):

                yield j

        else:

            yield i


print list(flatten(nests))

返回:


[1, 2, 3, 4, 5, 'hi', 6, 7, 'hello']

請注意,這并不能保證速度或開銷的使用,但是說明了一種遞歸解決方案,希望會對您有所幫助。


查看完整回答
反對 回復 2019-10-19
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

此函數應該能夠快速平整嵌套的可迭代容器,而無需使用任何遞歸:


import collections


def flatten(iterable):

    iterator = iter(iterable)

    array, stack = collections.deque(), collections.deque()

    while True:

        try:

            value = next(iterator)

        except StopIteration:

            if not stack:

                return tuple(array)

            iterator = stack.pop()

        else:

            if not isinstance(value, str) \

               and isinstance(value, collections.Iterable):

                stack.append(iterator)

                iterator = iter(value)

            else:

                array.append(value)

大約五年后,我對此事的看法發生了變化,使用它可能會更好:


def main():

    data = [1, 2, [3, 4, [5], []], [6]]

    print(list(flatten(data)))



def flatten(iterable):

    iterator, sentinel, stack = iter(iterable), object(), []

    while True:

        value = next(iterator, sentinel)

        if value is sentinel:

            if not stack:

                break

            iterator = stack.pop()

        elif isinstance(value, str):

            yield value

        else:

            try:

                new_iterator = iter(value)

            except TypeError:

                yield value

            else:

                stack.append(iterator)

                iterator = new_iterator



if __name__ == '__main__':

    main()


查看完整回答
反對 回復 2019-10-19
  • 3 回答
  • 0 關注
  • 1218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號