Подтвердить что ты не робот

Можно ли вернуть два списка из списка?

Можно ли вернуть два списка из списка? Ну, это явно не работает, но что-то вроде:

rr, tt = [i*10, i*12 for i in xrange(4)]

So rr и tt оба являются списками с результатами от i*10 и i*12 соответственно. Большое спасибо

4b9b3361

Ответ 1

>>> rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])
>>> rr
(0, 10, 20, 30)
>>> tt
(0, 12, 24, 36)

Ответ 2

Создание двух списков пониманий лучше (по крайней мере, для длинных списков). Имейте в виду, что ответ с наибольшим количеством голосов медленнее может быть даже медленнее, чем традиционный цикл for. Списки понимаются быстрее и понятнее.

python -m timeit -n 100 -s 'rr=[];tt = [];' 'for i in range(500000): rr.append(i*10);tt.append(i*12)' 
10 loops, best of 3: 123 msec per loop

> python -m timeit -n 100 'rr,tt = zip(*[(i*10, i*12) for i in range(500000)])' 
10 loops, best of 3: 170 msec per loop

> python -m timeit -n 100 'rr = [i*10 for i in range(500000)]; tt = [i*10 for i in range(500000)]' 
10 loops, best of 3: 68.5 msec per loop

Было бы неплохо увидеть списки, поддерживающие создание нескольких списков одновременно.

Тем не менее,

если вы можете воспользоваться преимуществом использования традиционного цикла (точнее, промежуточных вычислений), тогда, возможно, вам будет лучше с циклом (или iterator/generator с использованием yield). Вот пример:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in (range(1000) for x in range(10000)): tmp = list(i); rr.append(min(tmp));tt.append(max(tmp))" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min(list(i)) for i in (range(1000) for x in range(10000))];tt=[max(list(i)) for i in (range(1000) for x in range(10000))]"
100 loops, best of 3: 413 msec per loop

Конечно, сравнение в этих случаях несправедливо; в этом примере код и вычисления не эквивалентны, поскольку в традиционном цикле сохраняется временный результат (см. переменную tmp). Итак, понимание списка делает гораздо больше внутренних операций (вычисляет переменную tmp дважды !!).

Ответ 3

Пояснение списка позволяет возвращать несколько списков, если элементы являются списками. Так, например:

>>> x, y = [[] for x in range(2)]
>>> x
[]
>>> y
[]
>>>

Трюк с функцией zip выполнит задание, но на самом деле намного проще и читабельнее, если вы просто собираете результаты в списках с помощью цикла.