字典理解破坏了密钥列表

时间:2016-11-04 17:29:19

标签: python python-3.x dictionary

我正在尝试用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列表被销毁?

2 个答案:

答案 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转换为列表,但这种方法可能会浪费大量内存。