在Python中将列表列表转换为元组

Sea*_*ira 5 python list-comprehension python-itertools tuple-packing

我有一个列表列表(使用简单的列表推导生成):

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

我想将整个列表转换为包含列表中所有值的元组,即:

resulting_tuple = (1,1,1,2,1,3,1,4,1,5,2,1,2,2,2,3,2,4,2,5)
Run Code Online (Sandbox Code Playgroud)

最有效的方法是什么?(使用列表理解生成这个相同元组的方法也是可以接受的答案.)我在这里和Python文档中查看了答案,但是我找不到合适的答案.

编辑:

非常感谢所有回答的人!

Ale*_*lli 11

tuple(x for sublist in base_lists for x in sublist)
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,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))
Run Code Online (Sandbox Code Playgroud)

现在:

$ 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
Run Code Online (Sandbox Code Playgroud)

当列表更长时(即,当性能真的很重要时),事情会有所不同.例如,100 *在RHS上定义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
Run Code Online (Sandbox Code Playgroud)

所以对于长列表只是withsum一个性能灾难 - 其他人在同一个球场,虽然显然itertools有优势,而列表理解(当有丰富的内存可用时,因为它总是在微基准测试中;-)比genexps更快.

使用1000 *,genexp减慢约10倍(wrt 100 *),withit和listcomp约12次,withsum减少约180次(withsum O(N squared),加上它开始遭受那个大小的严重堆碎片).


CTT*_*CTT 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))
Run Code Online (Sandbox Code Playgroud)