2011-03-21 3 views
40

나는 키/값 쌍을 보유하고 파이썬 목록을 가지고 :키당 여러 값으로 사전 변환 목록에 표시 하시겠습니까?

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 

내가 키에 여러 값이 튜플로 집계 될 사전으로 목록을 변환 할 :

{ 1:('A', 'B'), 2:('C',) } 

반복적 인 해결책은 간단하다 :

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 
d={} 
for pair in l: 
    if d.has_key(pair[0]): 
     d[pair[0]]=d[pair[0]]+tuple(pair[1]) 
    else: 
     d[pair[0]]=tuple(pair[1]) 

print d 

{1: ('A', 'B'), 2: ('C',)} 

이 작업에 대한 더 우아한, 파이썬 솔루션이 있습니까?

+1

S/multilpe/여러 – vstrien

+0

'has_key'가의 쓰레기통에 그것의 방법에 파이썬 역사 - 사전에 키의 존재를 테스트해야한다면, 새로운 구문 인'if key in dict :'를 사용하십시오. 그러나 당신의 질문에 대한 "A"대답은 @ eumiro의 기본 접근 방식입니다. – PaulMcG

+2

@vstrien 감사합니다. '/ g'을 추가하면 좀 더 일반화 될 것입니다 :-) –

답변

41
from collections import defaultdict 

d1 = defaultdict(list) 

for k, v in l: 
    d1[k].append(v) 

d = dict((k, tuple(v)) for k, v in d1.iteritems()) 

d{1: ('A', 'B'), 2: ('C',)}

d1가 마지막 줄에 튜플로 변환됩니다 값으로 목록에 임시 defaultdict 지금이 포함되어 있습니다. 이렇게하면 목록에 추가하고 기본 루프에 튜플을 다시 만들지 않습니다.

+1

+1 멋진 멋진 도구입니다. –

7

DICT 값으로 목록 대신 튜플을 사용 :

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 
d={} 
for key, val in l: 
    d.setdefault(key, []).append(val) 

print d 
2

는 키가 이미 입력 목록에 분류합니까? 그런 경우, 당신은 기능적인 해결책을 가지고 :

import itertools 

lst = [(1, 'A'), (1, 'B'), (2, 'C')] 
dct = dict((key, tuple(v for (k, v) in pairs)) 
      for (key, pairs) in itertools.groupby(lst, lambda pair: pair[0])) 
print dct 
# {1: ('A', 'B'), 2: ('C',)} 
+0

'import operator'를 사용한다면,'itertools.groupby (sorted (lst), operator.itemgetter (0))' – eumiro

+0

@eumiro를 쓸 수 있습니다. 그래, 알아. 여기에 정렬을 사용하면 원하는 결과가 변경 될 수 있으므로, 적어도 이미 정렬되어 있는지 물어 본 것입니다. – tokland

10

이 방법은 상대적으로 효율적이며 매우 컴팩트 :

reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list)) 
+0

파이썬 3.5 이상에서는 유효하지만 올바르지 않습니다. – Davy

관련 문제