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

时间:2009-12-10 21:53:38

标签: python list-comprehension 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]]

我想把整个列表变成一个包含列表中所有值的元组,即:

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

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

修改

非常感谢所有回答的人!

5 个答案:

答案 0 :(得分: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

当列表更长时(即,当性能真的很重要时),事情会有所不同。例如,在RHS定义100 *

上放置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有优势但是列表理解(当有丰富的内存时,因为它总是在微基准测试中;-)比genexps快。

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

答案 1 :(得分: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))

答案 2 :(得分: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)

答案 3 :(得分:2)

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

答案 4 :(得分: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)