1

重複の可能性:
Pythonのリストの(不規則な)リストをフラット化する

例1:

リストがあるとしましょう:[[1,2]、[3,4]]。印刷できるように2つのforループを使用できます:1、2、3、4。

例2:

それで、出力が与えられ、list1内にネストされたリストがいくつあるかわからないとします。

list1 = [1、[1、2、[3、5、6、[..]、...、]]]]]]

それで、私の質問は、最初の例と同じ形式ですべての個々の番号をどのように印刷できるかということです。私は現在、結果としてネストされたリストを提供するものを使用していますが、関数への入力が異なると、ネストされたリストの量も異なります。

私が考えることができるのはこれを行うことですが、isinstanceの部分の後で何をすべきかわかりません:

c = 0
for i in list1:
   while c < len(list1):
         if isinstance(i, list):

         else:
              print i
         c += 1

ありがとう

最初の編集

ネストされたすべてのリストを分解して、私にとっても機能する単一のリストにする方法もある場合、これらの両方の問題に対する答えを知りたいと思います。

4

3 に答える 3

4

itertoolsのドキュメントには、リストなどを反復処理する非常に優れた例がいくつか含まれているため、このようなタスクに直面したときに開始するのに適した場所です。

多くのレベルのリストを作成しないようにするジェネレーターを使用することをお勧めします。

def flatten_all(iterable):
    for elem in iterable:
        if not isinstance(elem, list):
            yield elem
        else:
            for x in flatten_all(elem):
                yield x
            # in Python 3.3 just: yield from flatten_all(elem)

応用:

for x in flatten_all([1, [2, [3]]]):
    print(x)

# or if you need a list:
my_lst = list(flatten_all([1, [2, [3]]])
assert my_lst == [1, 2, 3]

編集:非再帰的線形バージョン

def flatten_all(iterable):
    stack = [iter(iterable)]
    while stack:
        try:
            elem  = stack[-1].next()
            if not isinstance(elem, list):
                yield elem
            else:
                stack.append(iter(elem))
        except StopIteration:
            stack.pop()
于 2012-11-16T10:33:34.323 に答える
1

これは、再帰を使用した例です。

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

def print_list(l):
    for e in l:
        if type(e) == list:
            print_list(e)
        else:
            print e

print_list(list1)
于 2012-11-16T10:27:38.323 に答える
1

あなたはこのようなことを試すことができます(コードはあなたのリストをフラットにします-1行でそれを後で印刷することができます):

def make_flat(arr):
    res = []
    for l in arr:
        if isinstance(l, list):# or isinstance(l, collections.Iterable)
            res.extend(make_flat(l)) 
        else:
            res.append(l)
    return res

flat = make_flat(list1)
for x in flat:
    print x

または:

def make_flat(arr):
    return sum(map(lambda a: make_flat(a) if isinstance(a,(list)) else [a],arr),[])
于 2012-11-16T10:26:05.283 に答える