94

Sqlite では、select .. fromコマンドは結果を返し、次のようoutputに表示されます。

>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]

タプルのリストのようです。output単純なリストに変換したい:

[12.2817, 12.2817, 0, 0, 8.52, 8.52]

または 2x3 行列:

12.2817 12.2817
0          0 
8.52     8.52

経由で読むoutput[i][j]

flatten コマンドは最初のオプションの仕事をしません.2番目のオプションはわかりません...

実際のデータははるかに大きいため、高速なソリューションが高く評価されます。

4

10 に答える 10

144

投稿された最速の(そして最短の)ソリューションは次のとおりです。

list(sum(output, ()))

ソリューションよりも約 50% 高速で、itertoolsソリューションよりも約 70% 高速ですmap

于 2012-05-17T13:22:37.990 に答える
60

Iterable 型で動作し、ここに示す他の方法よりも高速なリスト内包表記アプローチ。

flattened = [item for sublist in l for item in sublist]

lフラット化するリストです(outputOPの場合に呼び出されます)


timeit テスト:

l = list(zip(range(99), range(99)))  # list of tuples to flatten

リスト内包表記

[item for sublist in l for item in sublist]

timeit 結果 = ループあたり 7.67 µs ± 129 ns

リストextend()メソッド

flattened = []
list(flattened.extend(item) for item in l)

timeit 結果 = ループごとに 11 µs ± 433 ns

和()

list(sum(l, ()))

timeit 結果 = ループごとに 24.2 µs ± 269 ns

于 2018-07-11T17:14:29.553 に答える
9

使用itertoolsチェーン:

>>> import itertools
>>> list(itertools.chain.from_iterable([(12.2817, 12.2817), (0, 0), (8.52, 8.52)]))
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
于 2012-05-17T11:10:39.833 に答える
9
>>> flat_list = []
>>> nested_list = [(1, 2, 4), (0, 9)]
>>> for a_tuple in nested_list:
...     flat_list.extend(list(a_tuple))
... 
>>> flat_list
[1, 2, 4, 0, 9]
>>> 

上記のように、タプルのリストから単一のリストに簡単に移動できます。

于 2012-05-17T09:36:20.547 に答える
7

または、次のようにリストをフラット化できます。

reduce(lambda x,y:x+y, map(list, output))
于 2012-05-17T11:05:38.370 に答える
3

任意のネストされたリストの場合 (念のため):

def flatten(lst):
    result = []
    for element in lst: 
        if hasattr(element, '__iter__'):
            result.extend(flatten(element))
        else:
            result.append(element)
    return result

>>> flatten(output)
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
于 2012-05-17T10:03:21.833 に答える
3
def flatten_tuple_list(tuples):
    return list(sum(tuples, ()))


tuples = [(5, 6), (6, 7, 8, 9), (3,)]
print(flatten_tuple_list(tuples))
于 2021-02-05T16:58:54.730 に答える