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

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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

控訴裁判所によって取り下げられたメタン規制の施行を遅らせるEPAの試み

控訴裁判所によって取り下げられたメタン規制の施行を遅らせるEPAの試み

ゲッティ経由の画像。スコット・プルイットは環境保護庁の長であり、二酸化炭素とメタンガスとの愛情のこもった関係を持っていますが、彼は地球温暖化を信じることに冷たい肩を与えています。

メッセージングアプリの「誰かが入力している」バブルが実際に意味するもの

メッセージングアプリの「誰かが入力している」バブルが実際に意味するもの

一連の点滅する省略記号であろうと、「誰かが入力している」という明示的な通知であろうと、入力インジケーターと呼ばれるメッセージング機能は、多くの人にとって便利なツールであり、不安の原因でもあります。しかし、それがどのように機能するかについてもっと知ることは、少なくとも私たちにストレスを引き起こす推測ゲームを制限することができます。

マット・ラウアーは、離婚の和解で数百万ドルと馬の農場を失うことに「激怒」したと伝えられています

マット・ラウアーは、離婚の和解で数百万ドルと馬の農場を失うことに「激怒」したと伝えられています

マット・ラウアーと彼の妻のアネット・ロークは結婚間近であり、離婚手続きが激化していると伝えられています。ある情報筋は、ラウアーが「和解で約5,000万ドルをフォークする予定」であり、「マットは激怒している」と語った。彼は本質的に彼の純資産の半分をアネットに手渡している。

まあ、これは厄介です:レイプ告発者はケレンウィンズロージュニアの弁護士を彼女の攻撃者として特定します

まあ、これは厄介です:レイプ告発者はケレンウィンズロージュニアの弁護士を彼女の攻撃者として特定します

2018年6月15日金曜日、カリフォルニア州ビスタでの罪状認否の際、元NFLフットボール選手のケレンウィンズロージュニア(中央)が弁護士のブライアンワトキンス(左)とハーベイスタインバーグの後ろに立っています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language