Преобразование списка списков в кортеж в 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]] 

Я хочу превратить весь этот список в кортеж, содержащий все значения в списках, то есть:

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

Каким будет самый эффективный способ сделать это? (Способ создания этого же кортежа со списком будет также приемлемым ответом.) Я просмотрел ответы здесь и в документации Python, однако мне не удалось найти подходящий.

РЕДАКТИРОВАТЬ:

Большое спасибо всем, кто ответил!

     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, определяющий 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 имеет преимущество и список itertools (когда имеется itertools память, так как она всегда будет в microbenchmarks 😉 быстрее, чем genexps.

    Используя 1000 * , ген xp замедляется примерно в 10 раз (по 100 * ), с ним и списком объединяется примерно в 12 раз, а примерно в 180 раз (при условии, что 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)) 
     >>> 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) 

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

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