2016-11-04 3 views
4

저는 파이썬으로 순위 투표 시스템을 구현하려고합니다.사전 이해가 키 목록을 삭제합니다.

import numpy as np 
import itertools 

candidates = ['Bob', 'Alice', 'Jim', 'Sarah', 'Paul', 'Jordan'] 

votes = np.matrix(
    '1 2 5 3 4 6;' \ 
    '1 2 3 4 5 6;' \ 
    '5 1 2 4 3 6;' \ 
    '6 2 1 3 4 5;' \ 
    '4 3 2 1 5 7' 
    ) 

pairs = itertools.combinations(candidates, 2) # All pairs of candidates 

d = dict.fromkeys(pairs, 0) 

for pair in pairs: 
    print(pair) 

사전은 다음과 같습니다 :이 코드가

내가 원하는 것입니다
d 
=> {('Paul', 'Jordan'): 0, ('Alice', 'Sarah'): 0, ('Alice', 'Jim'): 0, ('Alice', 'Paul'): 0, ('Jim', 'Sarah'): 0, ('Sarah', 'Paul'): 0, ('Bob', 'Alice'): 0, ('Bob', 'Jordan'): 0, ('Jim', 'Jordan'): 0, ('Jim', 'Paul'): 0, ('Sarah', 'Jordan'): 0, ('Bob', 'Paul'): 0, ('Bob', 'Sarah'): 0, ('Bob', 'Jim'): 0, ('Alice', 'Jordan'): 0} 

. 하지만이 작업을 수행하면 터플 목록 인 pairs이 삭제 된 것 같습니다. 나는 사전 라인, 코드 출력 꺼내 경우

는 : 사전 온라인으로

('Bob', 'Alice') 
('Bob', 'Jim') 
('Bob', 'Sarah') 
('Bob', 'Paul') 
('Bob', 'Jordan') 
('Alice', 'Jim') 
('Alice', 'Sarah') 
('Alice', 'Paul') 
('Alice', 'Jordan') 
('Jim', 'Sarah') 
('Jim', 'Paul') 
('Jim', 'Jordan') 
('Sarah', 'Paul') 
('Sarah', 'Jordan') 
('Paul', 'Jordan') 

를, 아무것도 출력합니다 없습니다.

는 또한 사전 이해

d = {pair: 0 for pair in pairs} 

을 시도 그리고 같은 일이 발생했습니다. pairs리스트가 파괴되는 이유는 무엇입니까?

+3

'pairs'는 튜플 목록이 아닌 반복자입니다. –

+0

Yah는 목록으로 다시 작성합니다. – intrepidhero

답변

5

쌍으로 얻은 것은 생성자로서 일반적인 튜플 목록이 아닙니다. 그것은 그러나 한 번 쌍을 반복 한 후, 반복 가능하기 때문에 dict.fromkeys에 발전기를 통과하면 추가하여 그들에게

당신은 생성시 목록에 쌍을 캐스팅 수를 다시 인쇄 해 반복하려고 할 때 StopIteration를 호출, 유효 :

pairs = list(itertools.combinations(candidates, 2))

4

pairs은 제너레이터이며, 생성자는 번만 번만 반복 할 수 있습니다. 따라서 fromkeys은 해당 반복을 수행하므로 pairs이 모두 소모되어 아무 것도 포함하지 않습니다. 정확히 말하면 생성자 (친절하게도 @chepner가 지적한 바) 반복되는 동안 수신하는 모든 데이터를 실제로 포함하지는 않습니다. 그들은 바로에 을 생성합니다.

당신이 pairs한 번 더을 사용하려는 경우, 당신은 itertools.tee와 함께 두 개의 서로 다른 발전기로 분할 수 :

pairs1, pairs2 = itertools.tee(itertools.combinations(...)) 
그런 다음 당신은 사전에 다른 하나를 만드는 데 그 중 하나를 사용 - 인쇄를 할 수 있습니다.

간단하게 pairs을 목록으로 변환 할 수 있지만이 방법은 많은 메모리를 낭비 할 수 있습니다.