2012-01-30 13 views
10

मैं वेबोब MultiDict से नेस्टेड डिक्शनरी में एक पोस्ट को कन्वर्ट करना चाहता हूं। जैसेमल्टीडिक्ट को नेस्टेड डिक्शनरी में कनवर्ट करने के लिए कैसे करें

की एक पोस्ट से

तो:

'name=Kyle&phone.number=1234&phone.type=home&phone.number=5678&phone.type=work' 
एक multidict को

;

[('name', 'Kyle'), ('phone.number', '1234'), ('phone.type', 'home'), ('phone.number', '5678'), ('phone.type', 'work')] 
एक नेस्टेड शब्दकोश

{'name': 'Kyle', 
'phone': [ 
    { 
    'number': '12345', 
    'type': 'home', 
    },{ 
    'number': '5678', 
    'type': 'work', 
    }, 

कोई भी विचार करने के लिए

?

संपादित

मैं formencode पैकेज से variable_decode विधि निकालने विल द्वारा पोस्ट की गई के रूप में समाप्त हो गया। एकमात्र परिवर्तन जो आवश्यक था सूचियों को स्पष्ट करना है, उदा।

'name=Kyle&phone-1.number=1234&phone-1.type=home&phone-2.number=5678&phone-2.type=work' 

जो कई कारणों से बेहतर है।

+0

इसके अलावा से Peppercorn पर एक नज़र पिलोन प्रोजेक्ट: http://docs.pylonsproject.org/projects/peppercorn/en/latest/ इसे अपने रूपों के निर्माण के दौरान और अधिक स्पष्ट होने की आवश्यकता है, लेकिन मनमाने ढंग से घोंसले की अनुमति देता है। –

उत्तर

10

आप formencode है स्थापित या स्थापित कर सकते हैं यह, बाहर चेकआउट अगर उनकी variabledecode module

+0

मैंने variable_decode() विधि निकाली और यह पूरी तरह से धन्यवाद, काम करता है। –

1

मैं समय यह परीक्षण करने के लिए नहीं था और यह काफी प्रतिबंधात्मक है, लेकिन उम्मीद है कि इस काम करेंगे (मैं केवल पोस्टिंग कर रहा हूँ क्योंकि यह थोड़ी देर के बाद से आपने प्रश्न पोस्ट किया था):

>>> def toList(s): 
...  answer = [] 
...  L = s.split("&") 
...  for i in L: 
...    answer.append(tuple(i.split('='))) 
...  return answer 

>>> def toDict(L): 
...  answer = {} 
...  answer[L[0][0]] = L[0][1] 
...  for i in L[1:]: 
...    pk,sk = L[i][0].split('.') 
...    if pk not in answer: 
...      answer[pk] = [] 
...    if sk not in answer[pk][-1]: 
...      answer[pk][sk] = L[i][1] 
...    else: 
...      answer[pk].append({sk:L[i][1]}) 

यदि यह 100% नहीं है, तो कम से कम आपको अच्छी शुरूआत करनी चाहिए।

आशा इस

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, इसने मुझे स्पष्ट रूप से सूची बनाकर बनाई गई सीमा की बेहतर समझ दी। यह जानना मुश्किल है कि सूची बनाने के लिए जब तक कि यह कुंजी नाम में इंगित न हो जाए। –

1

मैं अपनी समस्या को हल करने के लिए एक स्पष्ट तरीका पसंद करते हैं मदद करता है:

  1. फूट डालो सदस्यों जो एक ही क्षेत्र नाम के साथ एक ही समूह में एक ही संरचना (या dict) के हैं, जैसे

    'name=Kyle&phone1=1234&phone1=home&phone2=5678&phone2=work' 
    
  2. रूप में क्षेत्रों के आदेश की गारंटी दी है, इसलिए multidict हो जाएगा: (('नाम', 'केली'), ('phone1', '123 4 ',' घर '), (' Phone2 ',' 5678 ',' काम '))

  3. तो कोड किया जाएगा:

    def extract(key, values): 
        extractor = { 
         "name":str, 
         "phone":lambda *args:dict(zip(('number', 'type'), args) 
        } 
        trimed_key = re.match(r"^(\w+)", key).group(1) 
        return trimed_key, extractor(trimed_key, *values) 
    
    nested_dict = {} 
    for i in multidict(): 
        key, values = i[0], i[1:] 
        nested_dict.setdefault(key, []) 
        trimed_key, data_wanted = extract(key, values) 
        nested_dict[trimed_key].append(data_wanted) 
    
    for key in nested_dict: 
        if len(nested_dict[key]) == 1: 
         nested_dict[key] = nested_dict[key][0] 
    
+0

प्रतिक्रिया के लिए धन्यवाद। इसका समाधान करने का तरीका स्पष्ट है। मैं विल द्वारा पोस्ट किए गए फॉर्मनकोड पैकेज से variable_decode() विधि का उपयोग समाप्त कर दिया। –