我正在尝试用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
列表被销毁?
答案 0 :(得分:5)
你对配对的是一个生成器而不是典型的元组列表。将生成器传递给dict.fromkeys
是有效的,因为它是可迭代的,但是在迭代一次之后,当您再次尝试迭代打印它们时会调用StopIteration
您可以在创建时通过添加以下内容将对转换为列表:
pairs = list(itertools.combinations(candidates, 2))
答案 1 :(得分:4)
pairs
是一个生成器,生成器只能在上迭代。因此,fromkeys
执行该迭代,因此pairs
现在已用尽且不包含任何内容。确切地说,生成器(正如@chepner所指出的那样)实际上并不包含迭代它们时收到的所有数据;他们即时生成 。
如果您想再次使用pairs
,可以将其拆分为两个不同的itertools.tee
生成器:
pairs1, pairs2 = itertools.tee(itertools.combinations(...))
然后你使用其中一个创建字典而另一个 - 进行打印。
虽然您可以简单地将pairs
转换为列表,但这种方法可能会浪费大量内存。