代码之家  ›  专栏  ›  技术社区  ›  Sean Vieira

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

  •  5
  • Sean Vieira  · 技术社区  · 15 年前

    >>> 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 回复  |  直到 15 年前
        1
  •  11
  •   Alex Martelli    15 年前
    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定义 基本列表

    $ 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倍和180倍(withsum为 O(N squared) ,再加上它开始遭受严重的堆碎片)。

        2
  •  5
  •   CTT    15 年前
    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))
    
        3
  •  3
  •   John La Rooy    15 年前
    >>> 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)
    
        4
  •  2
  •   Tendayi Mawushe    15 年前

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

        5
  •  0
  •   ghostdog74    15 年前
    >>> 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)