2009-03-17 14 views
10

İlk olarak, Python'da yeniyim, bu yüzden bir şeyi gözden kaçırdığımda özür dilerim, ancak bir başka sözlükte listelenen bir sözlük listesi oluşturmak için dict.fromkeys (veya benzer bir şey) kullanmak istiyorum. Bazı zamanlama testleri sahnede oluyorum ve anahtar girdi değişkeni ve liste ishal için süreleri içermesi olmak için İsterdim:Her bir anahtar için dict.fromkeys kullanarak nasıl benzersiz bir değer oluştururum?

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

yaşıyorum sorun olduğunu bütün tuşlar içinde sözlük aynı listeyi paylaşıyor gibi görünür ve her çalışma sadece ona eklenir. fromkeys kullanarak her anahtar için benzersiz bir boş liste oluşturmanın herhangi bir yolu var mı? Değilse, elde edilen sözlüğü elle üretmeden bunu yapmanın başka bir yolu var mı?

cevap

10

sorun

results = dict.fromkeys(inputs, []) 

[]

doğru orada, sadece bir kere elde olmasıdır.

Ben böyle bu kodu yeniden yazmak istiyorum

:

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

Diğer seçenek: Ben tavsiye her ne kadar sen (yeni bir şey öğrenmek istemiyorsanız

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

Harika, bu harika çalışıyor! Teşekkürler! (Yine de onları kullanmadan önce boş listeleri oluşturmak mümkün olsaydı) –

+0

Bu mümkün değil. [] Veya liste() çağırdığınızda, bir nesne oluşturulur ve değişken bağlanır. Örneğin bu x = [[]] * 10; x [0] .Append ('test'); print x – vartec

+0

Tamam, orada tüm liste ile alternatif var alternatif. – vartec

12

defaultdict'a bakın (Python 2.5 veya daha üstü gerektirir).

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

Bu çok işe yarıyor - Sadece bir "gerçek" sözlüğü olmasını istiyorum, bir tane gibi davranan bir sınıf değil. –

+0

Adil olmak gerekirse, çok az değişiklik gösteren bir alt sınıftır, bu yüzden "biri gibi davranmak" biraz güçlüydü. –

+0

+1 Kodunuzu Python <2.5 ile kullanmanız gerekmeyeceğinden emin olmanızın yolu budur. (son zamanlarda hosting tekliflerine bakıyorum ve hala Python 2.4 kullanan çok şey var). – vartec

2

Ayrıca yapabilirsiniz Yapıyorsunuz!) Hangi yöntemin daha hızlı olduğunu merak ediyorum?

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)) 
İlgili konular