2015-02-09 2 views
3

У меня есть итератор, который генерирует N кортежей, но здесь я буду притворяться, что у меня есть 3. Они все даже в длину.Как перенести сборку кортежей в словарь?

t1 = (a1, b1, c1) 
t2 = (a2, b2, c2) 
t3 = (a3, b3, c3) 

Я ищу, чтобы преобразовать выше в этом:

d = {a1: [a2, a3], 
     b1: [b2, b3], 
     c1: [c2, c3]} 

Я понимаю, что я должен перебрать кортежей и каким-то образом пронестись их в словарь, но я довольно много застрял.

ответ

5

Предполагая, что первые элементы в ваших списках различны, вы можете использовать списки, чтобы генерировать полученный dict.

Имейте в виду, что все ключи в dict являются уникальными. Поэтому, если a1 равно a2, t1 будет отменен t2.

>>> lists = [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3']] 

>>> d = {list[0]:list[1:] for list in zip(*lists)} 

>>> print d 
>>> {'a1': ('a2', 'a3'), 'b1': ('b2', 'b3'), 'c1': ('c2', 'c3')} 
+1

Отличный пример использования списков (dict)! – MrGumble

+0

Но это не то, о чем спрашивает плакат. –

+0

Предположительно. Первые элементы в списке разные. Это прекрасно работает для того, что мне нужно. Благодарю. – dizzystar

2

Вот способ добиться того, чего вы хотите:

ls = [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3']] 
# I create an iterator since that what you have in your problem 
it = iter(ls) 

keys = it.next() 
d = {k: [] for k in keys} 
for l in it: 
    for i, e in enumerate(l): 
     d[keys[i]].append(e) 

Полученный словарь {'a1': ['a2', 'a3'], 'c1': ['c2', 'c3'], 'b1': ['b2', 'b3']}.

+2

Чтобы заполнить 'd', вы можете сделать следующее:' d = collections.defaultdict (list) ' – ozgur

Смежные вопросы