2010-03-05 19 views
27

मैं वर्तमान में पाइथन में एक बहुआयामी शब्दकोश परिभाषित करने के लिए नीचे दी गई विधि का उपयोग कर रहा हूं। मेरा सवाल है: क्या यह multidimensional dicts को परिभाषित करने का पसंदीदा तरीका है? एक चाबी मौजूद है या पहले से ही 0 पर सेट है की जांच किए बिनापायथन में बहुआयामी शब्दकोश परिभाषित करने का सबसे अच्छा तरीका?

userdict['site1']['board1']['username'] = 'tommy' 

मैं भी इस का उपयोग कर रहा एक उपयोगकर्ता के लिए मक्खी पर काउंटर बढ़ाने के लिए:

from collections import defaultdict 

def site_struct(): 
    return defaultdict(board_struct) 

def board_struct(): 
    return defaultdict(user_struct) 

def user_struct(): 
    return dict(pageviews=0,username='',comments=0) 

userdict = defaultdict(site_struct) 

निम्नलिखित संरचना प्राप्त करने के लिए। उदा .:

userdict['site1']['board1']['username']['pageviews'] += 1 
+0

यह कोड पायथन दुभाषिया में नहीं चलाएगा। इससे यह समझना मुश्किल हो जाता है कि आप क्या करने की कोशिश कर रहे हैं। – krumpelstiltskin

उत्तर

43

टुपल्स हैंशबल हैं। शायद मैं इस बिंदु को याद कर रहा हूं, लेकिन आप इस सम्मेलन के साथ मानक शब्दकोश का उपयोग क्यों नहीं करते हैं कि चाबियाँ तीन बार होंगी? उदाहरण के लिए:

userdict = {} 
userdict[('site1', 'board1', 'username')] = 'tommy' 
+1

मैं इस दृष्टिकोण की अनुशंसा करता हूं, जब तक कि आपको कुछ फ़ंक्शन में उपयोगकर्ता की [[site1 '] को पास करने की आवश्यकता न हो। –

+0

मुझे यह विचार पसंद है। यह वास्तव में उनके अपरिवर्तनीय प्रकृति के कारण ट्यूपल्स अच्छा है। – jathanism

+2

यह बहुत अच्छी तरह से काम करता है, जब तक आपको 'site1' के अंतर्गत सभी बोर्ड प्रविष्टियों को सूचीबद्ध करने की आवश्यकता नहीं है। –

1

यह मेरे परिप्रेक्ष्य से एक सुंदर व्यक्तिपरक प्रश्न है। मेरे लिए, असली सवाल यह होगा कि आप इस घोंसले वाली डेटा संरचना को किस प्रकार से वस्तुओं से बदलते हैं ताकि आपको परिवर्तनों से प्रेरित किया जा सके। हालांकि, मैं निम्नलिखित के साथ बड़े प्रोटोटाइप नामस्थान बनाने के लिए जाना जाता है किया गया है:

from collections import defaultdict 

def nesteddict(): 
    return defaultdict(nesteddict) 
+0

यह समाधान आयामों को फिर से शुरू करने की क्षमता को संरक्षित करता है, लेकिन घोंसले के लिए निर्भरता बनाता है। – GregB

16

आप इस तरह किसी भी प्रकार की एक बहुआयामी शब्दकोश बना सकते हैं:

from collections import defaultdict 
from collections import Counter 

def multi_dimensions(n, type): 
    """ Creates an n-dimension dictionary where the n-th dimension is of type 'type' 
    """ 
    if n<=1: 
    return type() 
    return defaultdict(lambda:multi_dimensions(n-1, type)) 

>>> m = multi_dimensions(5, Counter) 
>>> m['d1']['d2']['d3']['d4'] 
Counter() 
+0

जब मैं इसे आज़माता हूं, तो मुझे 'टाइप एरर: आवश्यक तर्क' नाम '(pos 1) नहीं मिला' जो लाइन 'रिटर्न टाइप() 'को संदर्भित करता है। – hepcat72

+0

मैंने अपनी समस्या का पता लगाया - यह "एन-आयामी" शब्दकोशों को परिभाषित करने और इसे ऊपर परिभाषित करने के बीच में एक अंतर है। जैसे एक एकल डेटाम 0 आयामों द्वारा अनुक्रमित किया जाता है। एक साधारण सरणी 1 मिलीमीटर से अनुक्रमित होती है। सरणी की एक सरणी में vals 2 dims द्वारा अनुक्रमित है। और डिक्ट्स स्ट्रिंग द्वारा अनुक्रमित सरणी हैं। इसके पास रखे गए वाल्स (मेरे लिए) एक अतिरिक्त आयाम नहीं हैं, हालांकि मैं देखता हूं कि आप इस तरह से इस बारे में कैसे सोच सकते हैं। उपर्युक्त उदाहरण में, मैं इसे 4 डी डॉक कहूंगा, 5 नहीं। इसलिए मेरा कोड काम नहीं कर रहा था क्योंकि मुझे यह बताए गए कि एक आइकन @ 1 आयाम शर्मीली के बजाय मुझे किस प्रकार की उम्मीद थी। – hepcat72

1

यह बहुत ही व्यक्तिपरक है - लेकिन अगर आपके dict 2-गहरे से अधिक होने वाला है, मैं जो भी चाहता हूं उसे करने के लिए एक वर्ग और परिभाषित विधियों/गुणों को बनाने के लिए वापस आऊंगा।

मुझे लगता है कि आपका अंतिम लक्ष्य "बहु-कॉलम" डेटा संरचना बनाना होगा ताकि आप किसी विशेष वस्तु के लिए किसी भी विशेषता को स्टोर कर सकें (इस मामले में, साइट)। एक साइट क्लास बनाना इसे पूरा करेगा और फिर आप कुछ अन्य अपवादों के साथ जहां भी आप किसी अन्य ऑब्जेक्ट (वेरिएबल) करेंगे, उदाहरणों को छू सकते हैं।

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

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