4

オブジェクトがリストまたはスカラーになるオブジェクトのリストがあります。スカラーのみのフラット化されたリストが必要です。例えば:

L = [35,53,[525,6743],64,63,[743,754,757]]
outputList = [35,53,525,6743,64,63,743,754,757]

PSこの質問の答えは、異種リストでは機能しません。Python で浅いリストをフラット化する

4

11 に答える 11

10

これは、リストの深さを平坦化する比較的単純な再帰バージョンです。

l = [35,53,[525,6743],64,63,[743,754,757]]

def flatten(xs):
    result = []
    if isinstance(xs, (list, tuple)):
        for x in xs:
            result.extend(flatten(x))
    else:
        result.append(xs)
    return result

print flatten(l)
于 2012-05-17T08:36:41.573 に答える
5

を使用して1行できれいに行うことができますnumpy

import numpy as np
np.hstack(l)

あなたはndarrayで終わる

array([  35,   53,  525, 6743,   64,   63,  743,  754,  757])
于 2012-05-17T08:33:02.387 に答える
4
>>> data = [35,53,[525,6743],64,63,[743,754,757]]
>>> def flatten(L):
        for item in L:
            if isinstance(item,list):
                for subitem in item:
                    yield subitem
            else:
                yield item


>>> list(flatten(data))
[35, 53, 525, 6743, 64, 63, 743, 754, 757]

これは、コードゴルフ目的のワンライナーバージョンです(見栄えがよくありません:D)

>>> [y for x in data for y in (x if isinstance(x,list) else [x])]
[35, 53, 525, 6743, 64, 63, 743, 754, 757]
于 2012-05-17T08:40:45.210 に答える
3
l = [35,53,[525,6743],64,63,[743,754,757]]
outputList = []

for i in l:
    if isinstance(i, list):
        outputList.extend(i)
    else:
        outputList.append(i)
于 2012-05-17T08:22:56.383 に答える
1

あなたが言及した質問に基づいたワンライナーは次のとおりです。

list(itertools.chain(*((sl if isinstance(sl, list) else [sl]) for sl in l)))

更新:そして、完全に反復子ベースのバージョン:

from itertools import imap, chain
list(chain.from_iterable(imap(lambda x: x if isinstance(x, list) else [x], l)))
于 2012-05-17T08:24:35.010 に答える
1
outputList = []
for e in l:
    if type(e) == list:
        outputList += e
    else:
        outputList.append(e)

>>> outputList
[35, 53, 525, 6743, 64, 63, 743, 754, 757]
于 2012-05-17T08:24:41.787 に答える
0
>>> L = [35,53,[525,6743],64,63,[743,754,757]]
>>> K = []
>>> [K.extend([i]) if type(i) == int else K.extend(i) for i in L ]
[None, None, None, None, None, None]
>>> K
[35, 53, 525, 6743, 64, 63, 743, 754, 757]
于 2012-05-17T13:50:16.777 に答える
0
def nchain(iterable):
    for elem in iterable:
        if type(elem) is list:
            for elem2 in elem:
                yield elem2
        else:
            yield elem
于 2012-05-17T08:28:36.740 に答える
0

無限のツリー深度を可能にする再帰関数:

def flatten(l):
    if isinstance(l,(list,tuple)):
        if len(l):
            return flatten(l[0]) + flatten(l[1:])
        return []
    else:
        return [l]

>>>flatten([35,53,[525,[1,2],6743],64,63,[743,754,757]])
[35, 53, 525, 1, 2, 6743, 64, 63, 743, 754, 757]

ジェネリック型を許可するために isinstance を回避しようとしましたが、古いバージョンでは文字列で無限ループが発生していました。文字列を正しくフラット化するようになりました (文字単位ではなく、文字列がスカラーであるかのように)。

于 2012-05-17T08:39:27.937 に答える