Как распаковать список кортежей в отдельные списки?

Возможный дубликат:
Функция Transpose/Unzip в Python

У меня есть список кортежей, где я хочу разархивировать этот список на два независимых списка. Я ищу некоторую стандартизованную операцию в Python.

>>> l = [(1,2), (3,4), (8,9)]
>>> f_xxx (l)
[ [1, 3, 8], [2, 4, 9] ] 

Я ищу краткий и питонический способ добиться этого.

В принципе, я ищу для обратной операции zip().

Ответ 1

Используйте zip(*list):

>>> l = [(1,2), (3,4), (8,9)]
>>> list(zip(*l))
[(1, 3, 8), (2, 4, 9)]

Функция zip() объединяет элементы из всех входных данных, начиная с первых значений, затем второго и т.д. Используя *l вы применяете все кортежи в l как отдельные аргументы к функции zip(), поэтому пары zip() до 1 с 3 сначала 8, затем 2 с 4 и 9. Случается, что они хорошо соответствуют столбцам или транспозиции l.

zip() создает кортежи; если у вас должны быть изменяемые объекты списков, просто map() кортежи со списками или используйте понимание списков для создания списка списков:

map(list, zip(*l))          # keep it a generator
[list(t) for t in zip(*l)]  # consume the zip generator into a list of lists

Ответ 2

Если вам нужен список списков:

>>> [list(t) for t in zip(*l)]
[[1, 3, 8], [2, 4, 9]]

Если список кортежей в порядке:

>>> zip(*l)
[(1, 3, 8), (2, 4, 9)]