リストのリストからフラットリストを作成するにはどうすればよいですか?

3721
Emma 2009-06-05 10:30.

Pythonのリストのリストから簡単なリストを作成するショートカットがあるかどうか疑問に思います。

私はそれをforループで行うことができますが、おそらくいくつかのクールな「ワンライナー」がありますか?で試してreduce()みましたが、エラーが発生します。

コード

l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)

エラーメッセージ

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'

30 answers

5294
Alex Martelli 2009-06-05 10:37.

リストのリストが与えられるとt

flat_list = [item for sublist in t for item in sublist]

つまり:

flat_list = []
for sublist in t:
    for item in sublist:
        flat_list.append(item)

これまでに投稿されたショートカットよりも高速です。(tフラット化するリストです。)

対応する関数は次のとおりです。

flatten = lambda t: [item for sublist in t for item in sublist]

証拠としてtimeit、標準ライブラリのモジュールを使用できます。

$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in t for item in sublist]' 10000 loops, best of 3: 143 usec per loop $ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(t, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,t)'
1000 loops, best of 3: 1.1 msec per loop

説明:(での+暗黙の使用を含む)に基づくショートカットsumは、必然的に、O(T**2)Tサブリストがある場合です-中間結果リストが長くなり続けるにつれて、各ステップで新しい中間結果リストオブジェクトが割り当てられ、すべてのアイテムが割り当てられます前の中間結果では、コピーする必要があります(また、最後にいくつかの新しい結果を追加する必要があります)。したがって、簡単にするために、実際に一般性を失うことなく、それぞれk個のアイテムのT個のサブリストがあるとします。最初のk個のアイテムはT-1回、2番目のk個のアイテムはT-2回というようにコピーされます。コピーの総数は、1からTを除いたxのxの合計のk倍、つまり、k * (T**2)/2です。

リスト内包表記は、1つのリストを1回だけ生成し、各アイテムを(元の居住地から結果リストに)1回だけコピーします。

1705
Shawn Chin 2009-06-05 11:06.

あなたが使用することができますitertools.chain()

import itertools
list2d = [[1,2,3], [4,5,6], [7], [8,9]]
merged = list(itertools.chain(*list2d))

またはitertools.chain.from_iterable()*演算子を使用してリストを解凍する必要のないものを使用できます。

import itertools
list2d = [[1,2,3], [4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))
972
Triptych 2009-06-05 10:35.

著者からのメモ:これは非効率的です。しかし、モノイドは素晴らしいので、楽しいです。本番Pythonコードには適していません。

>>> sum(l, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]

これは、最初の引数で渡されたiterableの要素を合計し、2番目の引数を合計の初期値として扱います(指定されていない場合は、0代わりに使用され、この場合はエラーが発生します)。

ネストされたリストを合計しているため、実際に[1,3]+[2,4]は、の結果として得られます。sum([[1,3],[2,4]],[])これは[1,3,2,4]。に等しくなります。

リストのリストでのみ機能することに注意してください。リストのリストのリストについては、別のソリューションが必要になります。

549
Nico Schlömer 2017-07-26 23:38.

私はperfplot(私のペットプロジェクト、本質的にはラッパーtimeit)で最も提案されたソリューションをテストし、見つけました

import functools
import operator
functools.reduce(operator.iconcat, a, [])

多くの小さなリストといくつかの長いリストが連結されている場合の両方で、最速のソリューションになります。(operator.iadd同様に高速です。)


プロットを再現するコード:

import functools
import itertools
import numpy
import operator
import perfplot


def forfor(a):
    return [item for sublist in a for item in sublist]


def sum_brackets(a):
    return sum(a, [])


def functools_reduce(a):
    return functools.reduce(operator.concat, a)


def functools_reduce_iconcat(a):
    return functools.reduce(operator.iconcat, a, [])


def itertools_chain(a):
    return list(itertools.chain.from_iterable(a))


def numpy_flat(a):
    return list(numpy.array(a).flat)


def numpy_concatenate(a):
    return list(numpy.concatenate(a))


perfplot.show(
    setup=lambda n: [list(range(10))] * n,
    # setup=lambda n: [list(range(n))] * 10,
    kernels=[
        forfor,
        sum_brackets,
        functools_reduce,
        functools_reduce_iconcat,
        itertools_chain,
        numpy_flat,
        numpy_concatenate,
    ],
    n_range=[2 ** k for k in range(16)],
    xlabel="num lists (of length 10)",
    # xlabel="len lists (10 lists total)"
)
206
Greg Hewgill 2009-06-05 10:35.
from functools import reduce #python 3

>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(lambda x,y: x+y,l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

extend()あなたの例のメソッドはx、有用な値(reduce()期待する)を返す代わりに変更します。

reduceバージョンを実行するより速い方法は

>>> import operator
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(operator.concat, l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
185
Max Malysh 2019-07-27 08:34.

Djangoを使用している場合は、車輪の再発明をしないでください。

>>> from django.contrib.admin.utils import flatten
>>> l = [[1,2,3], [4,5], [6]]
>>> flatten(l)
>>> [1, 2, 3, 4, 5, 6]

...パンダ

>>> from pandas.core.common import flatten
>>> list(flatten(l))

... Itertools

>>> import itertools
>>> flatten = itertools.chain.from_iterable
>>> list(flatten(l))

... Matplotlib

>>> from matplotlib.cbook import flatten
>>> list(flatten(l))

...ユニパス

>>> from unipath.path import flatten
>>> list(flatten(l))

... Setuptools

>>> from setuptools.namespaces import flatten
>>> list(flatten(l))
125
pylang 2016-11-29 18:14.

これは、数値文字列ネストされたリスト、および混合コンテナに適用される一般的なアプローチです。

コード

#from typing import Iterable 
from collections import Iterable                            # < py38


def flatten(items):
    """Yield items from any nested iterable; see Reference."""
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            for sub_x in flatten(x):
                yield sub_x
        else:
            yield x

  • Python 3では、yield from flatten(x)置き換えることができますfor sub_x in flatten(x): yield sub_x
  • Python 3.8では、抽象基本クラスはからモジュールに移動さcollection.abctypingます。

デモ

lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(flatten(lst))                                         # nested lists
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

mixed = [[1, [2]], (3, 4, {5, 6}, 7), 8, "9"]              # numbers, strs, nested & mixed
list(flatten(mixed))
# [1, 2, 3, 4, 5, 6, 7, 8, '9']

参照

  • このソリューションは、Beazley、D。およびB.Jonesのレシピから変更されています。レシピ4.14、Python Cookbook 3rd Ed。、O'Reilly Media Inc.カリフォルニア州セバストポル:2013年。
  • 以前のSO投稿、おそらく元のデモンストレーションを見つけました。
57
MSeifert 2016-11-26 14:20.

ネストされている深さがわからないデータ構造をフラット化する場合は、1を使用できます。iteration_utilities.deepflatten

>>> from iteration_utilities import deepflatten

>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(deepflatten(l, depth=1))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> l = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
>>> list(deepflatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

これはジェネレーターであるため、結果をにキャストするlistか、明示的に反復する必要があります。


1つのレベルのみをフラット化し、各アイテム自体が反復可能である場合は、iteration_utilities.flattenそれ自体が単なる薄いラッパーであるものを使用することもできますitertools.chain.from_iterable

>>> from iteration_utilities import flatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(flatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

いくつかのタイミングを追加するだけです(この回答に示されている機能を含まないNicoSchlömerの回答に基づく):

これは、スパンされた膨大な範囲の値に対応するための両対数プロットです。定性的な推論の場合:低いほど良いです。

結果は、イテラブルに含まsumれる内部イテラブルが数個しかない場合は最速になりますが、長いイテラブルの場合はitertools.chain.from_iterableiteration_utilities.deepflattenまたはネストされた内包表記がitertools.chain.from_iterable最速で妥当なパフォーマンスを発揮することを示しています(NicoSchlömerがすでに気づいています)。

from itertools import chain
from functools import reduce
from collections import Iterable  # or from collections.abc import Iterable
import operator
from iteration_utilities import deepflatten

def nested_list_comprehension(lsts):
    return [item for sublist in lsts for item in sublist]

def itertools_chain_from_iterable(lsts):
    return list(chain.from_iterable(lsts))

def pythons_sum(lsts):
    return sum(lsts, [])

def reduce_add(lsts):
    return reduce(lambda x, y: x + y, lsts)

def pylangs_flatten(lsts):
    return list(flatten(lsts))

def flatten(items):
    """Yield items from any nested iterable; see REF."""
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x

def reduce_concat(lsts):
    return reduce(operator.concat, lsts)

def iteration_utilities_deepflatten(lsts):
    return list(deepflatten(lsts, depth=1))


from simple_benchmark import benchmark

b = benchmark(
    [nested_list_comprehension, itertools_chain_from_iterable, pythons_sum, reduce_add,
     pylangs_flatten, reduce_concat, iteration_utilities_deepflatten],
    arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)},
    argument_name='number of inner lists'
)

b.plot()

1免責事項:私はそのライブラリの作成者です

43
Nadia Alramli 2009-06-05 10:46.

私は自分の声明を取り戻します。合計は勝者ではありません。リストが小さい方が速いですが。ただし、リストが大きくなると、パフォーマンスが大幅に低下します。

>>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10000'
    ).timeit(100)
2.0440959930419922

合計バージョンはまだ1分以上実行されており、まだ処理が完了していません。

ミディアムリストの場合:

>>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
20.126545906066895
>>> timeit.Timer(
        'reduce(lambda x,y: x+y,l)',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
22.242258071899414
>>> timeit.Timer(
        'sum(l, [])',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
16.449732065200806

小さなリストとtimeitの使用:number = 1000000

>>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
2.4598159790039062
>>> timeit.Timer(
        'reduce(lambda x,y: x+y,l)',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
1.5289170742034912
>>> timeit.Timer(
        'sum(l, [])',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
1.0598428249359131
42
Meitham 2016-09-15 05:09.

と混同しているようoperator.addです!2つのリストを一緒に追加する場合、その正しい用語はconcat、追加ではなくです。operator.concat使用する必要があるものです。

あなたが機能的だと思っているなら、それはこれと同じくらい簡単です::

>>> from functools import reduce
>>> list2d = ((1, 2, 3), (4, 5, 6), (7,), (8, 9))
>>> reduce(operator.concat, list2d)
(1, 2, 3, 4, 5, 6, 7, 8, 9)

reduceはシーケンスタイプを尊重しているので、タプルを指定すると、タプルが返されます。リストを試してみましょう::

>>> list2d = [[1, 2, 3],[4, 5, 6], [7], [8, 9]]
>>> reduce(operator.concat, list2d)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

ああ、あなたはリストを取り戻します。

パフォーマンスはどうですか::

>>> list2d = [[1, 2, 3],[4, 5, 6], [7], [8, 9]]
>>> %timeit list(itertools.chain.from_iterable(list2d))
1000000 loops, best of 3: 1.36 µs per loop

from_iterableかなり速いです!しかし、で減らすことは比較できませんconcat

>>> list2d = ((1, 2, 3),(4, 5, 6), (7,), (8, 9))
>>> %timeit reduce(operator.concat, list2d)
1000000 loops, best of 3: 492 ns per loop
36
Andrea Ambu 2009-06-05 10:38.

なぜextendを使うのですか?

reduce(lambda x, y: x+y, l)

これは正常に機能するはずです。

34
pylang 2016-12-03 08:35.

more_itertoolsパッケージのインストールを検討してください。

> pip install more_itertools

flatten(ソース、itertoolsレシピから)の実装が付属しています:

import more_itertools


lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.flatten(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

注:ドキュメントに記載されているように、flattenリストのリストが必要です。より不規則な入力を平坦化する方法については、以下を参照してください。


バージョン2.4以降、more_itertools.collapse(source、abarnetによる提供)を使用して、より複雑でネストされたイテラブルをフラット化できます。

lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.collapse(lst)) 
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

lst = [[1, 2, 3], [[4, 5, 6]], [[[7]]], 8, 9]              # complex nesting
list(more_itertools.collapse(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
25
Igor Krivokon 2009-06-05 10:47.

関数が機能しなかった理由は、extendが配列をインプレースで拡張し、それを返さないためです。次のようなものを使用して、ラムダからxを返すことができます。

reduce(lambda x,y: x.extend(y) or x, l)

注:リストでは、extendは+よりも効率的です。

20
Anil 2016-10-26 15:12.
def flatten(l, a):
    for i in l:
        if isinstance(i, list):
            flatten(i, a)
        else:
            a.append(i)
    return a

print(flatten([[[1, [1,1, [3, [4,5,]]]], 2, 3], [4, 5],6], []))

# [1, 1, 1, 3, 4, 5, 2, 3, 4, 5, 6]
19
Saurabh Singh 2018-12-15 00:51.

再帰バージョン

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

def flatten_list(k):
    result = list()
    for i in k:
        if isinstance(i,list):

            #The isinstance() function checks if the object (first argument) is an 
            #instance or subclass of classinfo class (second argument)

            result.extend(flatten_list(i)) #Recursive call
        else:
            result.append(i)
    return result

flatten_list(x)
#result = [1,2,3,4,5,6,7,8,9,10]
18
CoderGuy123 2016-11-12 01:53.

上記のAnilの関数の悪い機能は、ユーザーが常に2番目の引数を空のリストとして手動で指定する必要があること[]です。代わりに、これをデフォルトにする必要があります。Pythonオブジェクトの動作方法により、これらは引数ではなく関数内に設定する必要があります。

動作関数は次のとおりです。

def list_flatten(l, a=None):
    #check a
    if a is None:
        #initialize with empty list
        a = []

    for i in l:
        if isinstance(i, list):
            list_flatten(i, a)
        else:
            a.append(i)
    return a

テスト:

In [2]: lst = [1, 2, [3], [[4]],[5,[6]]]

In [3]: lst
Out[3]: [1, 2, [3], [[4]], [5, [6]]]

In [11]: list_flatten(lst)
Out[11]: [1, 2, 3, 4, 5, 6]
16
EL_DON 2018-02-02 08:22.

matplotlib.cbook.flatten() ネストされたリストは、例よりも深くネストされている場合でも機能します。

import matplotlib
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
print(list(matplotlib.cbook.flatten(l)))
l2 = [[1, 2, 3], [4, 5, 6], [7], [8, [9, 10, [11, 12, [13]]]]]
print list(matplotlib.cbook.flatten(l2))

結果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

これはアンダースコアより18倍高速です。_。flatten:

Average time over 1000 trials of matplotlib.cbook.flatten: 2.55e-05 sec
Average time over 1000 trials of underscore._.flatten: 4.63e-04 sec
(time for underscore._)/(time for matplotlib.cbook) = 18.1233394636
16
user9074332 2018-09-24 16:08.

可変長のテキストベースのリストを処理するとき、受け入れられた答えは私にとってはうまくいきませんでした。これが私のために働いた別のアプローチです。

l = ['aaa', 'bb', 'cccccc', ['xx', 'yyyyyyy']]

うまくいかなかった受け入れられた答え:

flat_list = [item for sublist in l for item in sublist]
print(flat_list)
['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'xx', 'yyyyyyy']

新ソリューション提案でした私のために仕事を:

flat_list = []
_ = [flat_list.extend(item) if isinstance(item, list) else flat_list.append(item) for item in l if item]
print(flat_list)
['aaa', 'bb', 'cccccc', 'xx', 'yyyyyyy']
15
devil in the detail 2017-07-05 19:14.

以下は私には最も簡単に思えます:

>>> import numpy as np
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> print (np.concatenate(l))
[1 2 3 4 5 6 7 8 9]
11
mdh 2016-07-18 02:57.

NumPyのフラットを使用することもできます:

import numpy as np
list(np.array(l).flat)

2016年11月2日編集:サブリストのディメンションが同じ場合にのみ機能します。

7
A. Attia 2018-07-24 23:11.

あなたはnumpyを使うことができます:
flat_list = list(np.concatenate(list_of_list))

7
Alijy 2019-10-01 00:49.
from nltk import flatten

l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
flatten(l)

ここにある他のほとんどのソリューションに対するこのソリューションの利点は、次のようなリストがある場合です。

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

他のほとんどのソリューションはエラーをスローしますが、このソリューションはそれらを処理します。

6
mkultra 2016-10-27 17:24.

見た目をすっきりさせるために少しの速度をあきらめたい場合は、numpy.concatenate().tolist()またはnumpy.concatenate().ravel().tolist():を使用できます。

import numpy

l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] * 99

%timeit numpy.concatenate(l).ravel().tolist()
1000 loops, best of 3: 313 µs per loop

%timeit numpy.concatenate(l).tolist()
1000 loops, best of 3: 312 µs per loop

%timeit [item for sublist in l for item in sublist]
1000 loops, best of 3: 31.5 µs per loop

詳細については、ドキュメントnumpy.concatenateおよびnumpy.ravelをご覧ください。

6
Canuck 2016-11-29 11:09.

私が見つけた最速の解決策(とにかく大きなリストの場合):

import numpy as np
#turn list into an array and flatten()
np.array(l).flatten()

完了!もちろん、list(l)を実行してリストに戻すこともできます。

6
Vu Anh 2017-03-25 19:09.

underscore.pyパッケージファンの簡単なコード

from underscore import _
_.flatten([[1, 2, 3], [4, 5, 6], [7], [8, 9]])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

それはすべての平坦化の問題を解決します(リスト項目なしまたは複雑なネスト)

from underscore import _
# 1 is none list item
# [2, [3]] is complex nesting
_.flatten([1, [2, [3]], [4, 5, 6], [7], [8, 9]])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

underscore.pypipでインストールできます

pip install underscore.py
6
englealuze 2017-08-09 04:59.
def flatten(alist):
    if alist == []:
        return []
    elif type(alist) is not list:
        return [alist]
    else:
        return flatten(alist[0]) + flatten(alist[1:])
6
phoxis 2018-05-16 23:41.

これは最も効率的な方法ではないかもしれませんが、私はワンライナー(実際には2ライナー)を置くことを考えました。どちらのバージョンも、任意の階層のネストされたリストで機能し、言語機能(Python3.5)と再帰を利用します。

def make_list_flat (l):
    flist = []
    flist.extend ([l]) if (type (l) is not list) else [flist.extend (make_list_flat (e)) for e in l]
    return flist

a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = make_list_flat(a)
print (flist)

出力は

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

これは深さ優先の方法で機能します。再帰は、リスト以外の要素が見つかるまでダウンし、ローカル変数flistを拡張して、それを親にロールバックします。flist返されるときはいつでも、それはflistリスト内包の親のものに拡張されます。したがって、ルートでは、フラットリストが返されます。

上記のものは、いくつかのローカルリストを作成し、親のリストを拡張するために使用されるそれらを返します。これを回避する方法は、flist以下のようにgloablを作成することかもしれないと思います。

a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = []
def make_list_flat (l):
    flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l]

make_list_flat(a)
print (flist)

出力は再びです

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

現時点では効率についてはわかりませんが。

6
Brad Solomon 2018-02-02 08:33.

:以下はPython 3.3以降に適用されますyield_from。これは、を使用しているためです。six安定していますが、サードパーティのパッケージでもあります。または、を使用することもできますsys.version


の場合、obj = [[1, 2,], [3, 4], [5, 6]]リスト内包表記とを含む、ここでのすべての解決策は適切itertools.chain.from_iterableです。

ただし、この少し複雑なケースを考えてみましょう。

>>> obj = [[1, 2, 3], [4, 5], 6, 'abc', [7], [8, [9, 10]]]

ここにはいくつかの問題があります。

  • 1つの要素、6は単なるスカラーです。反復可能ではないため、上記のルートはここでは失敗します。
  • 一つの要素は、'abc'である(すべての技術的に反復可能なstrのです)。ただし、行間を少し読んで、そのように扱いたくはありません。単一の要素として扱いたいのです。
  • 最後の要素は、[8, [9, 10]]それ自体がネストされた反復可能です。基本的なリスト内包表記で、chain.from_iterable「1レベル下」のみを抽出します。

これは次のように修正できます。

>>> from collections import Iterable
>>> from six import string_types

>>> def flatten(obj):
...     for i in obj:
...         if isinstance(i, Iterable) and not isinstance(i, string_types):
...             yield from flatten(i)
...         else:
...             yield i


>>> list(flatten(obj))
[1, 2, 3, 4, 5, 6, 'abc', 7, 8, 9, 10]

ここでは、サブ要素(1)がIterableからのABCで反復可能であるitertoolsことを確認しますが、(2)要素が「文字列のような」ものではないことも確認します。

6
Deepak Yadav 2018-06-21 01:12.
flat_list = []
for i in list_of_list:
    flat_list+=i

このコードは、リストを完全に拡張するだけなので、正常に機能します。よく似ていますが、forループは1つしかありません。したがって、2つのforループを追加するよりも複雑さが少なくなります。

5
kederrac 2020-01-26 11:08.

あなたはlist extend方法を使うことができます、それは最も速いことを示します:

flat_list = []
for sublist in l:
    flat_list.extend(sublist)

パフォーマンス:

import functools
import itertools
import numpy
import operator
import perfplot



def functools_reduce_iconcat(a):
    return functools.reduce(operator.iconcat, a, [])


def itertools_chain(a):
    return list(itertools.chain.from_iterable(a))


def numpy_flat(a):
    return list(numpy.array(a).flat)


def extend(a):
    n = []

    list(map(n.extend, a))

    return n 


perfplot.show(
    setup=lambda n: [list(range(10))] * n,
    kernels=[
        functools_reduce_iconcat, extend,itertools_chain, numpy_flat
        ],
    n_range=[2**k for k in range(16)],
    xlabel='num lists',
    )

出力:

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language