0

在 Python 中,我目前正在处理一个非常大的 JSON 文件,其中包含一些深度字典和数组。我遇到了一个不稳定的问题。例如下面,它本质上是国家,有地区/州、城市和郊区。问题是如果只有一个郊区,它会返回一个字典,但如果有多个,它是一个带有字典的数组,这让我不得不添加另一行代码来更深入。当然,可以 ifelse/for it,但这只是变化无常的一小部分,而且它一直不适合 ifelse。

我想做的只是在比利时内搜索字典条目"code": "8400"并返回它在 JSON 文件中的位置。为了做这样的事情,我最好的方法是什么?谢谢!

***SNIP***    
{
        "code": "BE", 
        "name": "Belgium", 
        "regions": {
            "region": [
                {
                    "code": "45", 
                    "name": "Flanders", 
                    "places": {
                        "place": [
                            {
                                "code": "1790", 
                                "name": "Affligem"
                            }, 
                            {
                                "code": "8570", 
                                "name": "Anzegem"
                            }, 
                            {
                                "code": "8630", 
                                "name": "Diksmuide"
                            }, 
                            {
                                "code": "9600", 
                                "name": "Ronse"
                            }
                        ]
                    }, 
                    "subregions": {
                        "subregion": [
                            {
                                "code": "46", 
                                "name": "Coast", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "8300", 
                                            "name": "Knokke-Heist"
                                        }, 
                                        {
                                            "code": "8400", 
                                            "name": "Oostende", 
                                            "subplaces": {
                                                "subplace": {
                                                    "code": "8450", 
                                                    "name": "Bredene"
                                                }
                                            }
                                        }, 
                                        {
                                            "code": "8420", 
                                            "name": "De Haan"
                                        }, 
                                        {
                                            "code": "8430", 
                                            "name": "Middelkerke"
                                        }, 
                                        {
                                            "code": "8434", 
                                            "name": "Westende-Bad"
                                        }, 
                                        {
                                            "code": "8490", 
                                            "name": "Jabbeke"
                                        }, 
                                        {
                                            "code": "8660", 
                                            "name": "De Panne"
                                        }, 
                                        {
                                            "code": "8670", 
                                            "name": "Oostduinkerke"
                                        }
                                    ]
                                }
                            }, 
                            {
                                "code": "47", 
                                "name": "Cities", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "1000", 
                                            "name": "Brussels"
                                        }, 
                                        {
                                            "code": "2000", 
                                            "name": "Antwerp"
                                        }, 
                                        {
                                            "code": "8000", 
                                            "name": "Bruges"
                                        }, 
                                        {
                                            "code": "8340", 
                                            "name": "Damme"
                                        }, 
                                        {
                                            "code": "9000", 
                                            "name": "Gent"
                                        }
                                    ]
                                }
                            }, 
                            {
                                "code": "48", 
                                "name": "Interior", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "2260", 
                                            "name": "Westerlo"
                                        }, 
                                        {
                                            "code": "2400", 
                                            "name": "Mol"
                                        }, 
                                        {
                                            "code": "2590", 
                                            "name": "Berlaar"
                                        }, 
                                        {
                                            "code": "8500", 
                                            "name": "Kortrijk", 
                                            "subplaces": {
                                                "subplace": {
                                                    "code": "8940", 
                                                    "name": "Wervik"
                                                }
                                            }
                                        }, 
                                        {
                                            "code": "8610", 
                                            "name": "Handzame"
                                        }, 
                                        {
                                            "code": "8755", 
                                            "name": "Ruiselede"
                                        }, 
                                        {
                                            "code": "8900", 
                                            "name": "Ieper"
                                        }, 
                                        {
                                            "code": "8970", 
                                            "name": "Poperinge"
                                        }
                                    ]
                                }
                            },

编辑:

我被要求展示我目前是如何处理这个 JSON 文件的。Root 是一个字典,其中包含等于我要搜索的城市/郊区的数字。它没有事先定义它是城市还是郊区。下面是我在尝试学习如何挖掘这个 JSON 文件时的懒惰编码搜索,直到我意识到它变得多么复杂并且有点卡住了。 剪辑

for k in dataDict['countries']['country']:
    if k['code'] == root['country']:
        for y in k['regions']['region']['places']['place']:
            if y['code'] == root['place']:
                city = y['name']
            else:
                try:
                    for p in y['subplaces']['subplace']:
                        if p['code'] == root['place']:
                            city = p['name']
                except:
                    pass
4

1 回答 1

0

如果我理解得很好,每个字典都有以下结构:

{"code": # some int
 "name": # some str
  none / "country" / "place" / whatever # some dict or list

您可以编写一个递归函数来处理一个且只有一个字典:

def foo(my_dict):
    if my_dict['code'] == root['place']:
        city = my_dict['name']
    elif "country" in my_dict:
        city = foo(my_dict['country'])
    elif "place" in my_dict:
        # 
        # and so on...
    else:
        city = None
    return city

希望这个例子对你有所帮助。

于 2013-08-30T15:55:06.377 回答