2009-03-17 17 views
10

सबसे पहले, मैं पाइथन के लिए नया हूं, इसलिए अगर मैंने कुछ अनदेखा किया है, तो मैं क्षमा चाहता हूं, लेकिन सूचियों का एक शब्दकोश बनाने के लिए मैं dict.fromkeys (या कुछ समान) का उपयोग करना चाहता हूं, जिनकी चाबियाँ किसी अन्य सूची में प्रदान की जाती हैं। मैं कुछ समय परीक्षण प्रदर्शन कर रहा हूँ और मैं चाहता कुंजी इनपुट चर और सूची रनों के लिए बार शामिल करने के लिए होने के लिए: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 का उपयोग कर प्रत्येक कुंजी के लिए एक अद्वितीय खाली सूची उत्पन्न करने का कोई तरीका है? यदि नहीं, तो परिणामी शब्दकोश को हाथ से उत्पन्न किए बिना ऐसा करने का कोई और तरीका है?

उत्तर

10

समस्या यह है कि

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

बहुत बढ़िया, यह अच्छी तरह से काम करता है! धन्यवाद! (हालांकि मैं चाहता हूं कि मुझे उपयोग करने से पहले रिक्त सूचियां उत्पन्न करना संभव हो) –

+0

यह संभव नहीं है। एक बार जब आप [] या सूची() को कॉल करते हैं तो ऑब्जेक्ट बनाया जाता है और परिवर्तनीय बाध्य होता है। उदाहरण के लिए देखें x = [[]] * 10; एक्स [0] .append ('परीक्षण'); प्रिंट x – vartec

+0

ठीक है, वहां आपके पास तत्काल सभी सूची के साथ विकल्प है। – vartec

12

defaultdict देखें (पाइथन 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

यह अच्छी तरह से काम करता है - मैं सिर्फ यह चाहता हूं कि यह एक "वास्तविक" शब्दकोश था, न कि एक वर्ग होने का नाटक करता है। –

+0

निष्पक्ष होने के लिए, यह बहुत कम परिवर्तन वाले उप-वर्ग है, इसलिए "एक होने का नाटक" थोड़ा मजबूत लगता है। –

+0

+1 यदि आप सुनिश्चित हैं कि आपको पाइथन <2.5 के साथ अपने कोड का उपयोग नहीं करना पड़ेगा तो यह करने का तरीका है। (हाल ही में मैंने होस्टिंग ऑफ़र देखे हैं, और अभी भी पाइथन 2.4 का उपयोग कर बहुत कुछ है)। – vartec

2

तुम भी ऐसा कर सकते हैं यदि आप नहीं है कुछ नया सीखने की (चाहते हैं, हालांकि मैं सलाह देते हैं आप करते हैं!) मुझे उत्सुकता है कि कौन सी विधि तेज है?

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)) 
संबंधित मुद्दे

 संबंधित मुद्दे