0

Python では、現在、いくつかの深い辞書と配列を含む非常に大きな JSON ファイルを扱っています。一定ではないという問題があります。以下の例では、基本的には国であり、地域/州、都市、および郊外があります。問題は、郊外が 1 つしかない場合は辞書を返しますが、複数ある場合は辞書を含む配列であるため、別のコード行を追加してさらに深くする必要があります。確かに、ifelse はできますが、これは矛盾のごく一部にすぎず、常に 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 ファイルをどのように処理しているかを示すよう求められました。ルートは、検索しようとしている都市/郊外に等しい数字を含む辞書です。事前に都市か郊外かを定義するものではありません。以下は、この 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