16 Stimmen

Wie kann ich mit dict.fromkeys für jeden Schlüssel einen eindeutigen Wert erstellen?

Zunächst bin ich neu in Python, also entschuldige ich mich, wenn ich etwas übersehen habe, aber ich würde gerne dict.fromkeys (oder etwas Ähnliches), um ein Wörterbuch mit Listen zu erstellen, deren Schlüssel in einer anderen Liste enthalten sind. Ich führe einige Timing-Tests durch und möchte, dass der Schlüssel die Eingabevariable ist und die Liste die Zeiten für die Läufe enthält:

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

Das Problem, das ich habe, ist, dass alle Schlüssel im Wörterbuch dieselbe Liste zu haben scheinen, und jeder Durchlauf wird einfach daran angehängt. Gibt es eine Möglichkeit, eine eindeutige leere Liste für jeden Schlüssel zu erzeugen, indem man fromkeys ? Wenn nicht, gibt es eine andere Möglichkeit, dies zu tun, ohne das resultierende Wörterbuch von Hand zu erstellen?

14voto

vartec Punkte 124396

Das Problem ist, dass in

results = dict.fromkeys(inputs, [])

[] wird nur einmal ausgewertet, und zwar genau hier.

Ich würde den Code so umschreiben:

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

Eine andere Möglichkeit ist:

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

12voto

Hank Gay Punkte 67607

Vérifiez Standarddiktat (erfordert Python 2.5 oder höher).

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

2voto

Jason Coon Punkte 16347

Sie können dies auch tun, wenn Sie nichts Neues lernen wollen (obwohl ich Ihnen das empfehle!) Ich bin neugierig, welche Methode schneller ist.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X