[英]How to get nested dictionary from JSON in Python
我想要一些JSON,將其轉換為字典,然后更改該字典中的某些值。
我嘗試了如下所示的一些操作,但無法按預期工作。
我的JSON如下:
{
"9":[
{
"09_000":{
"name":"Wyatt Feldt",
"1":"R",
"2":"L",
"w":1,
"h_t":1
}
},
{
"09_001":{
"name":"Clayton Friend",
"1":"R",
"2":"R",
"w":0,
"h_t":0
}
}
],
"10":[
{
"09_000":{
"name":"Wyatt Feldt",
"1":"R",
"2":"L",
"w":1,
"h_t":1
}
},
{
"09_001":{
"name":"Clayton Friend",
"1":"R",
"2":"R",
"w":0,
"h_t":0
}
}
],
"11":[
{
"09_000":{
"name":"Wyatt Feldt",
"1":"R",
"2":"L",
"w":1,
"h_t":1
}
},
{
"09_001":{
"name":"Clayton Friend",
"1":"R",
"2":"R",
"w":0,
"h_t":0
}
}
]
}
然后在Python中我編寫了print(my_data["9"][0])
,該函數返回{'09_000':{'name':'Wyatt Feldt','1':'R','2':'L ','w':1,'h_t':1}}。
但是,我只希望它返回{'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t':1},因為我不這樣做。如果只想打印它,我想設置一些值,例如名稱。 而且我知道我可以通過執行my_data["9"][0]["09_000"]
來做到這一點,但我不想使用該ID來獲取它(僅外部組,索引然后是鍵例如“名稱”)。 由於我已經返回了{'09_000':{'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t':1}}我確定必須有一種方法來獲取嵌套部分({'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t ':1}),因此我可以更改值。
編輯:我認為這是一個不同的問題。 我的my_data
變量已經采用字典格式,這是索引的一種特殊情況。
如果要訪問該特定元素,則可以執行以下操作:
n_entry = 0
entry_key_name = f'09_{n_entry:03}' # If using >= python 3.6
# entry_key_name = '09_{:03}'.format(n_entry) # If using < python 3.6
print(register["9"][n_entry][entry_key_name])
結果:
{'name': 'Wyatt Feldt', '1': 'R', '2': 'L', 'w': 1, 'h_t': 1}
如果字符串中包含JSON文本,則說它的名稱為my_json
,則可以使用Python的json.loads
將其轉換為字典。
import json
register = json.loads(my_json)
在字典的旁邊,您有鍵“ 9”,“ 10”,“ 11”。 對於其中的每一個,您都有一個可以迭代的兩個項目的列表。 列表中的每個項目都是一鍵字典。 您只需要遍歷這些最后的鍵,而不必知道它們是什么:
for k in register:
for block in register[k]:
for block_key in block:
print(block[block_key])
我從中得到的輸出是:
{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}
{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}
{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}
如果您知道列表始終將包含一個鍵的項,那么另一種方法是使用block.keys()
生成字典鍵的列表,然后獲取列表中的第一個(也是唯一的)項:
for k in register:
for block in register[k]:
print(block[block.keys()[0]])
無論如何,您都可以用一些命令替換我已使用的print
語句,以更改所需的內容。 盡管為了更容易到達正確的位置,請嘗試使用列表的索引號:
for k in register:
for i in range(len(register[k])):
for key in register[k][i]:
original_name = register[k][i][key][u'name']
if original_name == u'Wyatt Feldt':
register[k][i][key][u'name'] = 'Wyatt Erp'
感謝@Primusa的評論。
我已經完成了print(list(my_data["9"][0].values())[0])
,它可以按預期工作。
通常,如果您知道內部字典中只有一個鍵/值對,而您只想要它的值,則可以枚舉值,然后訪問第一個,如下所示:
wyatt = list(my_data["9"][0].values())[0] # {'name': 'Wyatt Feldt', ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.