簡體   English   中英

將一個簡單的字典變成帶有嵌套列表的字典

[英]Turn a simple dictionary into dictionary with nested lists

鑒於從網絡表單接收到以下數據:

for key in request.form.keys():
    print key, request.form.getlist(key)

group_name [u'myGroup']
category [u'social group']
creation_date [u'03/07/2013']
notes [u'Here are some notes about the group']
members[0][name] [u'Adam']
members[0][location] [u'London']
members[0][dob] [u'01/01/1981']
members[1][name] [u'Bruce']
members[1][location] [u'Cardiff']
members[1][dob] [u'02/02/1982']

我怎樣才能把它變成這樣的字典? 它最終將被用作JSON,但是由於JSON和字典很容易互換,我的目標只是獲得以下結構。

event = {
    group_name : 'myGroup',
    notes : 'Here are some notes about the group,
    category : 'social group',
    creation_date : '03/07/2013',
    members : [
        {
            name : 'Adam',
            location : 'London',
            dob : '01/01/1981'
        }
        {
            name : 'Bruce',
            location : 'Cardiff',
            dob : '02/02/1982'
        }
    ]
}

到目前為止,這是我所管理的。 使用以下列表理解,我可以輕松理解普通字段:

event = [ (key, request.form.getlist(key)[0]) for key in request.form.keys() if key[0:7] != "catches" ]

但我在成員名單上苦苦掙扎。 可以有任意數量的成員。 我想我需要分別為他們創建一個列表,並將其添加到具有非迭代記錄的字典中。 我可以這樣獲得會員數據:

tmp_members = [(key, request.form.getlist(key)) for key in request.form.keys() if key[0:7]=="members"]

然后,我可以拉出列表索引和字段名稱:

member_arr = []
members_orig = [ (key, request.form.getlist(key)[0]) for key in request.form.keys() if key[0:7] == 

"members" ]
for i in members_orig:
    p1 = i[0].index('[')
    p2 = i[0].index(']')
    members_index = i[0][p1+1:p2]
    p1 = i[0].rfind('[')
    members_field = i[0][p1+1:-1]

但是如何將其添加到我的數據結構中。 以下內容不起作用,因為我可能要先嘗試在members[0][name]之前處理members[1][name] members[0][name]

members_arr[int(members_index)] = {members_field : i[1]}

這似乎很令人費解。 有沒有這樣做的簡單方法,如果沒有,我該如何使它工作?

您可以將數據存儲在字典中,然后使用json庫。

import json
json_data = json.dumps(dict)
print(json_data)

這將打印一個json字符串。

在這里查看json庫

是的,將其轉換為字典,然后使用json.dumps()和一些可選參數以所需的格式打印JSON:

eventdict = {
    'group_name': 'myGroup',
    'notes': 'Here are some notes about the group',
    'category': 'social group',
    'creation_date': '03/07/2013',
    'members': [
        {'name': 'Adam',
         'location': 'London',
         'dob': '01/01/1981'},
        {'name': 'Bruce',
         'location': 'Cardiff',
         'dob': '02/02/1982'}
        ]
    }

import json

print json.dumps(eventdict, indent=4)

key:value對的順序並不總是一致的,但是如果您只是在尋找可以由腳本解析的漂亮的JSON,同時又保持人類可讀性,那么這應該可以工作。 您還可以使用以下命令按字母順序對鍵進行排序:

print json.dumps(eventdict, indent=4, sort_keys=True)

以下python函數可用於從平面字典創建嵌套字典。 只需將html形式的輸出傳遞給解碼()。

def get_key_name(str):
    first_pos = str.find('[')
    return str[:first_pos]

def get_subkey_name(str):
    '''Used with lists of dictionaries only'''
    first_pos = str.rfind('[')
    last_pos = str.rfind(']')
    return str[first_pos:last_pos+1]

def get_key_index(str):
    first_pos = str.find('[')
    last_pos = str.find(']')
    return str[first_pos:last_pos+1]

def decode(idic):
    odic = {} # Initialise an empty dictionary
    # Scan all the top level keys
    for key in idic:
        # Nested entries have [] in their key
        if '[' in key and ']' in key:
            if key.rfind('[') == key.find('[') and key.rfind(']') == key.find(']'):
                print key, 'is a nested list'
                key_name = get_key_name(key)
                key_index = int(get_key_index(key).replace('[','',1).replace(']','',1))
                # Append can't be used because we may not get the list in the correct order.
                try:
                    odic[key_name][key_index] = idic[key][0]
                except KeyError: # List doesn't yet exist
                     odic[key_name] = [None] * (key_index + 1)
                     odic[key_name][key_index] = idic[key][0]
                except IndexError: # List is too short
                     odic[key_name] = odic[key_name] + ([None] * (key_index - len(odic[key_name]) + 1 ))
                     # TO DO: This could be a function
                     odic[key_name][key_index] = idic[key][0]
            else:
                key_name = get_key_name(key)
                key_index = int(get_key_index(key).replace('[','',1).replace(']','',1))
                subkey_name = get_subkey_name(key).replace('[','',1).replace(']','',1)
                try:
                    odic[key_name][key_index][subkey_name] = idic[key][0]
                except KeyError: # Dictionary doesn't yet exist
                    print "KeyError"
                    # The dictionaries must not be bound to the same object
                    odic[key_name] = [{} for _ in range(key_index+1)]
                    odic[key_name][key_index][subkey_name] = idic[key][0]
                except IndexError: # List is too short
                    # The dictionaries must not be bound to the same object
                    odic[key_name] = odic[key_name] + [{} for _ in range(key_index - len(odic[key_name]) + 1)]
                    odic[key_name][key_index][subkey_name] = idic[key][0]
        else:
            # This can be added to the output dictionary directly
            print key, 'is a simple key value pair'
            odic[key] = idic[key][0]
    return odic

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM