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),加上它开始遭受那个大小的严重堆碎片).
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)