Преобразование списка списков к кортежу в Python

В jQuery я главным образом использую:

$("#element").trigger("change");
5
задан Sean Vieira 10 December 2009 в 23:54
поделиться

5 ответов

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 * в правой части, определяющей 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 раз,

11
ответ дан 18 December 2019 в 07:29
поделиться
>>> 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)
0
ответ дан 18 December 2019 в 07:29
поделиться
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))
5
ответ дан 18 December 2019 в 07:29
поделиться
>>> 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
ответ дан 18 December 2019 в 07:29
поделиться

result_tuple = tuple (элемент для l в base_lists для элемента в l)

2
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: