2017-02-09 14 views

उत्तर

9

एक defaultdictडिफ़ॉल्ट मान के लिए आम तौर पर है नहीं वास्तव में एक मूल्य, यह एक कारखाने: एक विधि है कि एक नया मान उत्पन्न करता है। आप एक लैम्ब्डा अभिव्यक्ति कि एक सूची बनाता है का उपयोग करके इस समस्या को हल कर सकते हैं:

lst = lambda:list(range(0,5)) 
d = defaultdict(lst)

यह भी यहाँ एक अच्छा विचार है, अन्यथा सभी मूलभूत मूल्यों होगा संदर्भ एक ही सूची के बाद से। यहाँ उदाहरण के लिए:

d[1].append(14) 

d[2] पर प्रभाव (दोनों d[1] और d[2] दिया मौजूद नहीं था) नहीं होगा।

आप तथापि प्राप्त कर सकते हैं इस साथ:

val = list(range(0,5)) 
lst = lambda:val 
d = defaultdict(lst) 

लेकिन इस अवांछित दुष्प्रभाव हो सकते हैं: अगर आप यहाँ d[1].append(14) प्रदर्शन तो d[2][1,2,3,4,5,12] हो जाएगा और d[1] is d[2]True हो जाएगा:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from collections import defaultdict 
>>> val = list(range(0,5)) 
>>> lst = lambda:val 
>>> d = defaultdict(lst) 
>>> d[1] 
[0, 1, 2, 3, 4] 
>>> d[1].append(14) 
>>> d[2] 
[0, 1, 2, 3, 4, 14] 
>>> d[1] is d[2] 
True 

जबकि:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from collections import defaultdict 
>>> lst = lambda:list(range(0,5)) 
>>> d = defaultdict(lst) 
>>> d[1] 
[0, 1, 2, 3, 4] 
>>> d[1].append(14) 
>>> d[2] 
[0, 1, 2, 3, 4] 
>>> d[1] is d[2] 
False 
+0

अच्छी तरह से समझाया। –

+0

@ जीन-फ्रैंकोइसफैबर: धन्यवाद :) –

+0

इसलिए मैं मौजूदा सूची पर डिफॉल्ट डिक्ट का उपयोग नहीं कर सकता, 'ए = [5,2,3] 'कहूं? – Arcyno

5

आप पैरामीटर बनाना चाहिए कॉल करने योग्य, कहें, lambda का उपयोग करके:

from collections import defaultdict 

d = defaultdict(lambda: list(range(0,5))) 
print(d[0]) 
# [0, 1, 2, 3, 4] 
4

Default dictionary प्रतिदेय स्वीकार करता है पहला तर्क, तो क्या आप क्या करना चाहते अगले कदम है (जो परिभाषित नहीं मान के लिए डिफ़ॉल्ट कारखाना है) के रूप में:

from collections import defaultdict 


default_factory = (lambda: list(range(0,5)) 
d = defaultdict(default_factory) 

What is a "callable" in Python? तो सवाल में के बारे में प्रतिदेय और अधिक देखें।

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

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