anahtara bağlı olarak iç içe geçmiş bir dic içinde belirli bir alt konu alın
Dec 19 2020
İç içe geçmiş bir sözlüğüm var. Ve belirli bir özniteliğe dayalı bir alt sözlüğü çıkarmak istiyorum: İşte sözlüğümün daha basit bir versiyonu:
subdata = {
"id": 997,
"acronym": "root",
"color_hex_triplet": "FFFFFF",
"children": [
{
"id": 8,
"acronym": "grey",
"color_hex_triplet": "BFDAE3",
"children": [
{
"id": 567,
"acronym": "CH",
"color_hex_triplet": "B0F0FF",
"children": [
{
"id": 688,
"acronym": "CTX",
"color_hex_triplet": "B0FFB8",
"children": [
{
"id": 695,
"acronym": "CTXpl",
"color_hex_triplet": "70FF70",
"children": [
{
"id": 315,
"acronym": "Isocortex",
"color_hex_triplet": "70FF71",
"children": [
{
"id": 184,
"acronym": "FRP",
"color_hex_triplet": "268F45",
"children": [
{
"id": 68,
"acronym": "FRP1",
"color_hex_triplet": "268F45",
"children": []
},
{
"id": 69,
"acronym": "FRP2",
"color_hex_triplet": "268F45",
"children": []
}]}]}]}]}]]}]}]}
Ve örneğin "kısaltma": "FRP" ye dayanarak, o belirli sözlüğü ve bunun gibi tüm alt öğelerini elde etmek istiyorum:
region_dict = {
"id": 184,
"acronym": "FRP",
"color_hex_triplet": "268F45",
"children": [
{
"id": 68,
"acronym": "FRP1",
"color_hex_triplet": "268F45",
"children": []},
{"id": 69,
"acronym": "FRP2",
"color_hex_triplet": "268F45",
"children": []
}]}
Aşağıdaki kodu denedim (Aplet123'ün önerisinden), ancak sözlüğü döndürmüyor gibi görünüyor. Yalnızca True döndürür. Yanlış bir şey mi yapıyorum?
def get_parent_dict(dic, reg):
if dic['acronym'] == reg:
return dic
for child in dic["children"]:
result = get_parent_dict(child, reg) is not None
if result is not None:
return result
return None # not technically needed
f = open(json_path)
data = json.load(f)
subdata = data['msg'][0] #this is a nested dictionary
region_dict = get_parent_dict(subdata, "FRP")
Yanıtlar
1 Aplet123 Dec 19 2020 at 05:24
Önce derinlik araması kullanabilirsiniz:
def dfs_for_id(dic, id):
if dic["id"] == id:
return dic
for child in dic["children"]:
result = dfs_for_id(child, id)
if result is not None:
return result
return None # not technically needed
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'