Распаковка списка/кортежей пар на два списка/кортежей

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

У меня есть список, который выглядит так:

list = (('1','a'),('2','b'),('3','c'),('4','d'))

Я хочу отделить список в 2 списках.

list1 = ('1','2','3','4')
list2 = ('a','b','c','d')

Я могу сделать это, например, с помощью

list1 = []
list2 = []
for i in list:
   list1.append(i[0])
   list2.append(i[1])

Но я хочу знать, есть ли более элегантное решение.

Ответ 1

>>> source_list = ('1','a'),('2','b'),('3','c'),('4','d')
>>> list1, list2 = zip(*source_list)
>>> list1
('1', '2', '3', '4')
>>> list2
('a', 'b', 'c', 'd')

Изменить: Обратите внимание, что zip(*iterable) является его собственным обратным:

>>> list(source_list) == zip(*zip(*source_list))
True

При распаковке в два списка это становится:

>>> list1, list2 = zip(*source_list)
>>> list(source_list) == zip(list1, list2)
True

Добавление, предложенное rockportrocker.

Ответ 2

list1= ( x[0] for x in source_list )
list2= ( x[1] for x in source_list )