2014-02-21 2 views
4

나는 사전 목록을 가지고 있으며, 그것들을 하나의 명명 된 튜플 목록에 병합하고자합니다. 첫 번째 튜플에있는 모든 목록의 첫 번째 요소를 원하고 두 번째 튜플에있는 두 번째 요소를 원한다.파이썬에서 'Zip'목록 사전

예 :이 같은

{'key1': [1, 2, 3], 'key2': [4, 5, 6], 'key3': [7, 8, 9]} 

그리고이 결과 목록이 원하는 :

[('key1': 1, 'key2': 4, 'key3': 7), 
('key1': 2, 'key2': 5, 'key3': 8), 
('key1': 3, 'key2': 6, 'key3': 9)] 

내가이 일을의 우아한 방법이 생각?

편집 :

내가 @Ashwini Chaudhary에 의해 사전 버전 @ 스티브 Jessop의 namedtuple 응답의 시간을 실행 비교 한과 전 다소 빠르다 :

d = {key: numpy.random.random_integers(0, 10000, 100000) 
     for key in ['key1', 'key2', 'key3']} 

부근에 있습니다. 100 개 실행의 :

namedtuple and map: 0.093583753109 
namedtuple and zip: 0.119455988407 
dictionary and zip: 0.159063346386 
+1

사전은 정렬 된 데이터 구조가 아닙니다. 시도해 봤어? – msvalkon

+0

더 정확한 질문이 업데이트되었습니다. 아직 아무 것도 시도하지 않았습니다 ... – rongved

답변

5

먼저 열쇠를 얻을. 이 단계에서 원하는대로 또는 원하는대로 정렬 할 수 있습니다. 어쩌면 어떤 순서로 어떤 키를 사용해야할지 알 수 있으므로 데이터를 검사 할 필요가 없습니다.

keys = list(d.keys()) 

명명 된 튜플을 정의

Record = collections.namedtuple('Record', keys) 

으로 반복 모든 목록을 병렬 :

[Record(*t) for t in zip(*(d[k] for k in keys))] 

또는 list(map(Record, *(d[k] for k in keys))) 당신은 map을 고려합니다. keys 경우 사전에 키 순서는 임의의 경우에도 그 값의 순서와 동일하게 보장 있기 때문에 단지 list(d.keys()) 다음, (d[k] for k in keys) 대신에 d.values()를 사용할 수있는

참고.

Record = collections.namedtuple('Record', d.keys()) 
[Record(*t) for t in zip(*(d.values()))] 

또는 list(map(Record, *d.values())) 당신이 map을 좋아하는 경우 : 당신이 namedtuple의 필드의 순서에 대해 걱정하지 않는 경우, 그래서 그것은을 단순화합니다.

+0

+1 thx 보증을 위해;) – zhangxaochen

5
>>> d = {'key1': [1, 2, 3], 'key2': [4, 5, 6], 'key3': [7, 8, 9]} 
>>> keys = d.keys() 
>>> [dict(zip(keys, vals)) for vals in zip(*(d[k] for k in keys))] 
[{'key3': 7, 'key2': 4, 'key1': 1}, 
{'key3': 8, 'key2': 5, 'key1': 2}, 
{'key3': 9, 'key2': 6, 'key1': 3}]