python - 정수로 - 파이썬 자료형




키당 여러 값으로 사전 변환 목록에 표시 하시겠습니까? (3)

키 / 값 쌍을 보유하는 파이썬 목록이 있습니다.

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',)}

이 작업을위한 좀 더 우아하고 파이썬적인 솔루션이 있습니까?


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

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

print d

이 방법은 상대적으로 효율적이고 매우 컴팩트합니다.

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

파이썬 3에서는 다음과 같이된다.

dict(functools.reduce(lambda x, d: x[d[0]].append(d[1]) or x, l, collections.defaultdict(list)))

reduce가 functools로 옮겨 졌으므로 lambdas는 더 이상 튜플을 허용하지 않습니다. 이 버전은 2.6 및 2.7에서 여전히 작동합니다.


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 은 목록을 값으로 갖는 임시 기본 명령이며 마지막 행의 튜플로 변환됩니다. 이렇게하면 목록에 추가하고 기본 루프에 튜플을 다시 만들지 않습니다.





type-conversion