代码之家  ›  专栏  ›  技术社区  ›  Kyle Cronin

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

  •  11
  • Kyle Cronin  · 技术社区  · 15 年前

    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 ? 如果没有,是否有其他方法可以在不手动生成结果字典的情况下执行此操作?

    3 回复  |  直到 15 年前
        1
  •  12
  •   vartec    15 年前

    问题在于

    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))
    
        2
  •  12
  •   Hank Gay    15 年前

    退房 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))
    
        3
  •  2
  •   Jason Coon    15 年前

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

    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))