Как мне создать уникальное значение для каждого ключа, используя dict.fromkeys? - PullRequest
11 голосов
/ 17 марта 2009

Во-первых, я новичок в 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? Если нет, есть ли другой способ сделать это без создания результирующего словаря вручную?

Ответы [ 3 ]

12 голосов
/ 17 марта 2009

Извлечение 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))
10 голосов
/ 17 марта 2009

Проблема в том, что в

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 голосов
/ 17 марта 2009

Вы также можете сделать это, если вы не хотите изучать что-то новое (хотя я рекомендую это делать!) Мне интересно, какой метод быстрее?

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...