2014-10-17 4 views
-3

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

tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')] 

dic = dict(tuples) 

print dic 

Это дает выход:

{'a': '1', 'b': ''1', 'c': '2', 'd': '3'} 

Но я ищу:

{'1': 'a' 'b', '2': 'c', '3': 'd'} 

Есть простой код, который может произвести этот ?

+0

http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping –

+0

@ RicardoCárdenes: значения здесь не уникальны. –

+1

@MartijnPieters OP не сказал, как он справится с ними. – simonzack

ответ

1

Построить словарь в цикле, собирая свои значения в списках:

result = {} 

for value, key in tuples: 
    result.setdefault(key, []).append(value) 

dict.setdefault() method установит и вернуть значение по умолчанию, если ключа нет. Здесь я использовал его для установки значения пустого списка по умолчанию, если ключ отсутствует, поэтому .append(value) применяется к объекту списка всегда.

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

Демонстрация:

>>> tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')] 
>>> result = {} 
>>> for value, key in tuples: 
...  result.setdefault(key, []).append(value) 
... 
>>> result 
{'1': ['a', 'b'], '3': ['d'], '2': ['c']} 
+0

Плюс одиннадцать миллиардов на «Не пытайтесь сделать это сочетание значений строк и строк в нескольких строках, вы только усложняете дело в будущем». –

0
from operator import itemgetter 
from itertools import groupby 
first = itemgetter(0) 
second = itemgetter(1) 
d = dict((x, [v for _, v in y]) for x, y in groupby(sorted(tuples, key=second), key=second) 

groupby группы кортежей в новый итератор кортежей, чей первый элемент является уникальным вторым элементом каждого из исходного, а второго элемента является другого итератора состоящий из соответствующих первых предметов. Быстрый пример (довольно отпечатанный для ясности):

>>> list(groupby(sorted(tuples, key=second), key=second))) 
[('1', <itertools._grouper object at 0x10910b8d0>), 
('2', <itertools._grouper object at 0x10910b790>), 
('3', <itertools._grouper object at 0x10910b750>)] 

Сортировка по тому же ключу используется groupby необходимо убедиться, что все, как элементы группируются вместе; groupby делает только один проход через список.

Субтераторы состоят из кортежей, таких как ('1', 'a'), поэтому значение второе значение в каждом элементе - это тот, который мы хотим добавить к значению в нашем новом словаре.