2017-04-21 3 views
-1

오늘 내 친구가 나에게 힘들어하는 일에 직면했다. Python에서 dict comprehension을 사용하여 키와 값의 개별 목록으로 사전 만들기

은 기초 :

keys = ["name", "surname", "age"] 
values = ['John Miller 20', 
      'James Smith  30', 
      'Gary Jones  50' 
     ] 
d = {} 

우리는 다음과 같은 형식으로 사전을 만들 싶습니다

{'name': ['John', 'James', 'Gary'], 
'surname': ['Miller', 'Smith', 'Jones'], 
'age': [20, 30, 50]} 

까다로운 부분은 우리가 하나 개의 라인에서 그것을하고 싶은 것입니다 .

나는 여러분이 생각해 낼 접근법에 매우 흥미가 있습니다!

+0

스택 오버플로 코드 작성 서비스가 없습니다 @를 것 같은데. – Vallentin

+0

[CodeGolf] (https://codegolf.stackexchange.com/) – GiantsLoveDeathMetal

답변

1

까다로운 부분은 단 한 줄로 처리하는 것입니다.

zip 몇 개를 함께 묶을 수 있습니다. 지금 print(d)을 할 경우

d = dict(zip(keys, list(zip(*[value.split() for value in values])))) 

는 것 출력 :

{'name': ('John', 'James', 'Gary'), 'surname': ('Miller', 'Smith', 'Jones'), 'age': ('20', '30', '50')} 

value.split() 항상 3 개 값을 초래한다고 가정 물론이다.

편집 : 당신은 튜플 목록 싶은 경우, 다음 믹스에 list(a) for a in ...를 던져 :

d = dict(zip(keys, list(list(a) for a in zip(*[value.split() for value in values])))) 

출력한다 :

{'name': ['John', 'James', 'Gary'], 'surname': ['Miller', 'Smith', 'Jones'], 'age': ['20', '30', '50']} 
+0

시도하십시오. 줄을 사용하여'lists'로 출력 할 수도 있습니까? – nlsdfnbch

+1

@nlsdfnbch 예, 제 편집을보세요. – Vallentin

0

어떻게 numpy를 사용하는 방법에 대해?

import numpy as np 

d = dict(zip(keys, np.array([i.split() for i in values]).transpose().tolist())) 

{'age': ['20', '30', '50'], 
'name': ['John', 'James', 'Gary'], 
'surname': ['Miller', 'Smith', 'Jones']} 

벤치 마크 : Vallentin의 대답은 빠른

time d = dict(zip(keys, list(zip(*[value.split() for value in values])))) 

CPU times: user 23 µs, sys: 1 µs, total: 24 µs 
Wall time: 29.1 µs 

time d = dict(zip(keys, np.array([i.split() for i in values]).transpose().tolist())) 

CPU times: user 41 µs, sys: 6 µs, total: 47 µs 
Wall time: 47.9 µs