5

リストのリストがあります(単純なリスト内包表記で生成されます):

>>> base_lists = [[a, b] for a in range(1, 3) for b in range(1, 6)]
>>> base_lists

[[1,1],[1,2],[1,3],[1,4],[1,5],[2,1],[2,2],[2,3],[2,4],[2,5]]

このリスト全体を、リスト内のすべての値を含むタプルに変換したい、つまり:

resulting_tuple = (1,1,1,2,1,3,1,4,1,5,2,1,2,2,2,3,2,4,2,5)

これを行うための最も効果的な方法は何でしょうか? (リスト内包表記を使用してこの同じタプルを生成する方法も、受け入れられる答えです。) ここと Python のドキュメントで答えを見てきましたが、適切なものを見つけることができませんでした。

編集:

回答してくれたすべての人に感謝します!

4

5 に答える 5

11
tuple(x for sublist in base_lists for x in sublist)

編集base_lists非常に短いため、genexp(無制限のメモリが利用可能)が遅いことに注意してください。次のファイルを検討してくださいtu.py

base_lists = [[a, b] for a in range(1, 3) for b in range(1, 6)]

def genexp():
  return tuple(x for sublist in base_lists for x in sublist)

def listcomp():
  return tuple([x for sublist in base_lists for x in sublist])

def withsum():
  return tuple(sum(base_lists,[]))

import itertools as it

def withit():
  return tuple(it.chain(*base_lists))

今:

$ python -mtimeit -s'import tu' 'tu.genexp()'
100000 loops, best of 3: 7.86 usec per loop
$ python -mtimeit -s'import tu' 'tu.withsum()'
100000 loops, best of 3: 5.79 usec per loop
$ python -mtimeit -s'import tu' 'tu.withit()'
100000 loops, best of 3: 5.17 usec per loop
$ python -mtimeit -s'import tu' 'tu.listcomp()'
100000 loops, best of 3: 5.33 usec per loop

リストが長い場合 (つまり、パフォーマンスが本当に重要な場合) は少し異なります。たとえば、100 *RHS 定義に a を配置すると、次のようになりbase_listsます。

$ python -mtimeit -s'import tu' 'tu.genexp()'
1000 loops, best of 3: 408 usec per loop
$ python -mtimeit -s'import tu' 'tu.withsum()'
100 loops, best of 3: 5.07 msec per loop
$ python -mtimeit -s'import tu' 'tu.withit()'
10000 loops, best of 3: 148 usec per loop
$ python -mtimeit -s'import tu' 'tu.listcomp()'
1000 loops, best of 3: 278 usec per loop

したがって、長いリストの場合にのみwithsumパフォーマンスが低下します。他のリストは同じ球場にありますが、明らかitertoolsに優位性があり、リスト内包表記 (マイクロベンチマークでは常にそうであるように、十分なメモリが利用可能な場合;-) はジェネクスよりも高速です。

を使用する1000 *と、genexp は約 10 倍 (100 *に関して)、withit と listcomp は約 12 倍、withsum は約 180 倍遅くなります (withsum はO(N squared)であり、そのサイズでは深刻なヒープの断片化に悩まされ始めています)。

于 2009-12-10T22:00:10.750 に答える
5
from itertools import chain
base_lists = [[a, b] for a in range(1, 3) for b in range(1, 6)]

print tuple(chain(*base_lists))
于 2009-12-10T22:07:38.837 に答える
3
>>> sum(base_lists,[])
[1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5]
>>> tuple(sum(base_lists,[]))
(1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5)
于 2009-12-10T22:02:08.890 に答える
2

resulting_tuple = tuple(item for l in base_lists for item in l)

于 2009-12-10T22:05:18.120 に答える
0
>>> arr=[]
>>> base_lists = [[a, b] for a in range(1, 3) for b in range(1, 6)]
>>> [ arr.extend(i) for i in base_lists ]
[None, None, None, None, None, None, None, None, None, None]
>>> arr
[1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5]
>>> tuple(arr)
(1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 2, 1, 2, 2, 2, 3, 2, 4, 2, 5)
于 2009-12-11T07:16:20.553 に答える