如何使用dict.fromkeys为每个键创建唯一值?[复制]

How do I create a unique value for each key using dict.fromkeys? [duplicate]

提问人:Kyle Cronin 提问时间:3/17/2009 更新时间:7/4/2016 访问量:9777

问:

首先,我是 Python 的新手,所以如果我忽略了某些东西,我深表歉意,但我想使用(或类似的东西)来创建一个列表字典,其键在另一个列表中提供。我正在执行一些计时测试,我希望键是输入变量,列表包含运行时间:dict.fromkeys

def benchmark(input):
    ...
    return time_taken

runs = 10
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55)
results = dict.fromkeys(inputs, [])

for run in range(0, runs):
    for i in inputs:
        results[i].append(benchmark(i))

我遇到的问题是字典中的所有键似乎共享同一个列表,并且每次运行都只是附加到它。有没有办法为每个键生成一个唯一的空列表?如果没有,有没有其他方法可以在不手动生成生成的字典的情况下做到这一点?fromkeys

python 字典 fromkeys

评论


答:

12赞 Hank Gay 3/17/2009 #1

查看 defaultdict(需要 Python 2.5 或更高版本)。

from collections import defaultdict

def benchmark(input):
    ...
    return time_taken

runs = 10
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55)
results = defaultdict(list) # Creates a dict where the default value for any key is an empty list

for run in range(0, runs):
    for i in inputs:
        results[i].append(benchmark(i))

评论

0赞 Kyle Cronin 3/17/2009
这也很好用——我只是希望它是一本“真正的”词典,而不是一个假装的类。
0赞 Hank Gay 3/17/2009
公平地说,它是一个变化非常小的子类,所以“假装是一个”似乎有点强。
0赞 vartec 3/17/2009
+1 如果您确定不必在 Python < 2.5 中使用代码,这就是执行此操作的方法。(最近我查找了托管服务,还有很多仍在使用 Python 2.4)。
0赞 Hank Gay 3/17/2009
@vartec 好点子 - 我会在答案本身的正文中添加免责声明。
0赞 hughdbrown 3/19/2009
defaultdict 在很多情况下都很有用。我第一次听说它是在 Peter Norvig 的“如何编写拼写校正器”中: norvig.com/spell-correct.html
14赞 vartec 3/17/2009 #2

问题是在

results = dict.fromkeys(inputs, [])

[] 只计算一次,就在那里。

我会像这样重写这段代码:

runs = 10
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55)
results = {}

for run in range(runs):
    for i in inputs:
        results.setdefault(i,[]).append(benchmark(i))

其他选项是:

runs = 10
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55)
results = dict([(i,[]) for i in inputs])

for run in range(runs):
    for i in inputs:
        results[i].append(benchmark(i))

评论

0赞 Kyle Cronin 3/17/2009
太棒了,效果很好!谢谢!(尽管我希望在我不得不使用它们之前能够生成空列表)
0赞 vartec 3/17/2009
这是不可能的。调用 [] 或 list() 后,将创建一个对象并绑定变量。例如,查看这个 x = [[]]*10;x[0].append('测试');打印 x
0赞 vartec 3/17/2009
好的,你有其他选择,所有列表都实例化了。
1赞 Brian 3/18/2009
python3 中实际上有字典(和集合)推导式。语法为“{x:[] for x in inputs}”
2赞 jfs 3/18/2009
[]可以丢弃:results = dict((key, []) for key in inputs)
2赞 Jason Coon 3/17/2009 #3

如果你不想学习任何新东西,你也可以这样做(尽管我建议你这样做!我很好奇哪种方法更快?

results = dict.fromkeys(inputs)

for run in range(0, runs):
    for i in inputs:
        if not results[i]:
            results[i] = []
        results[i].append(benchmark(i))