2016-11-04 6 views
4

私は投票投票システムをPythonで実装しようとしています。私はこのコードを持っている:辞書の理解は鍵のリストを破壊する

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はジェネレータであり、ジェネレータはを1回だけ反復できるです。したがって、fromkeysはその反復を行い、したがってpairsは使い果たされ、何も含まれていません。正確には、ジェネレーター(親切には@chepnerによって指摘されています)、受け取ったデータをすべて反復処理しているわけではありません。彼らはそれをの上でに生成しています。そして、あなたは辞書と別のものを作成するためにそれらのいずれかを使用

pairs1, pairs2 = itertools.tee(itertools.combinations(...)) 

- :あなたはpairsもう一回を使用したい場合は

、あなたはitertools.teeを持つ2つの異なる発電機に分割でき印刷を行う。

pairsを単純にリストに変換することはできますが、この方法では多くのメモリが浪費される可能性があります。

関連する問題