2014-10-17 5 views
-3

튜플로 사전을 만들었지 만 원래 튜플을 편집하지 않고 키와 값을 전환하는 방법에 대한 답을 찾지 못하는 것 같습니다. 이 생산할 수있는 간단한 코드가파이썬 사전 키 할당

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

: 내가 찾고

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

그러나이 출력을 제공

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

dic = dict(tuples) 

print dic 

: 이것은 내가 지금까지 무엇을 가지고 ?

+0

http://scackoverflow.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')과 같은 튜플로 구성되어 있으므로 각 항목의 두 번째 값은 새 사전의 값에 추가 할 값입니다.