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

2024-04-26 06:39:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表列表(通过简单的列表理解生成):

>>> 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]]

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

^{pr2}$

最有效的方法是什么?(用列表理解来生成这个元组的方法也是一个可以接受的答案)我已经在这里和Python文档中找到了答案,但是我没有找到合适的答案。在

编辑:

非常感谢所有回答的人!在


Tags: 方法答案in文档编辑列表forbase
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)
tuple(x for sublist in base_lists for x in sublist)

编辑:请注意,由于base_lists很短,genexp(具有无限可用内存)非常慢。考虑以下文件tu.py

^{pr2}$

现在:

$ 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

当列表较长时(例如,当性能非常重要时),情况会有点不同。E、 g.在定义base_lists的RHS上加一个100 *

$ 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是一个性能灾难——其他的都在同一个范围内,尽管显然{}具有优势,并且列表理解(当有足够的内存可用时,就像它总是在microbenchmarks中一样;-)比genexps更快。在

使用1000 *,genexp的速度降低了大约10倍(与100 *相比),它和listcomp的速度降低了大约12倍,而sum的速度大约是180倍(thsum是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))

相关问题 更多 >