3

次のような多数のエントリを含むJSONファイルがあります。

    {
    "area1": "California",
    "area2": "Sierra Eastside",
    "area3": "Bishop Area",
    "area4": "Volcanic Tablelands (Happy/Sad Boulders)",
    "area5": "Fish Slough Boulders",
    "grade": "V6 ",        
    "route": "The Orgasm",
    "type1": "Boulder",
    "type2": "NONE",
    "type3": "NONE",
    "type4": "NONE",
},

areaとエントリを取得して配列に変換したいと思いtypeます。

   {
    "area": ["California","Sierra Eastside","Bishop Area","Volcanic Tablelands (Happy/Sad Boulders)","Fish Slough Boulders"]
    "grade": "V6 ",        
    "route": "The Orgasm",
    "type": ["Boulder","NONE","NONE","NONE"]
},

私はほとんど機能するこのコードを持っています:

json_data=open('../json/routes_test.json')
datas = json.load(json_data)
datas_arrays = []
area_keys = ['area1','area2','area3','area4','area5']
type_keys = ['type1','type2','type3','type4']

for data in datas:
    areaArray = []
    typeArray = []
    deleteArray = []
    for k, v in data.iteritems():
        for area_key in area_keys:
            if (k == area_key):
                areaArray.append(v)
                deleteArray.append(k)
        for type_key in type_keys:
            if (k == type_key):
                typeArray.append(v)
                deleteArray.append(k)
    for k in deleteArray:
        del data[k]
    data['area'] = areaArray
    data['type'] = typeArray
    datas_arrays.append(data)
    print datas_arrays
    print "********"

out = json.dumps(datas_arrays, sort_keys=True,indent=4, separators=(',', ': '))
print out
f_out= open('../json/toues_test_intoarrays.json', 'w')    
f_out.write(out)
f_out.close()   

問題は、area配列がすべて故障していて、type配列が逆方向になっていることです。これは私にはできません。1つが順序付けられておらず、もう1つが順序付けられているが、逆になっているのは奇妙だと思います。私には、反復によってそれらが順番に配置されていることを確認する必要があるように思われます。

4

2 に答える 2

5

Python辞書には任意の順序があり、並べ替えられていません。代わりに、事前に作成されたキーのリストを使用します。

with open('../json/routes_test.json') as json_data:
    datas = json.load(json_data)
    area_keys = ['area1','area2','area3','area4','area5']
    type_keys = ['type1','type2','type3','type4']

    for data in datas:
        data['area'] = [data[k] for k in area_keys]
        data['type'] = [data[k] for k in type_keys]
        for k in area_keys + type_keys:
            del data[k]

out = json.dumps(datas, sort_keys=True, indent=4, separators=(',', ': '))
print out
with open('../json/toues_test_intoarrays.json', 'w') as f_out:
    f_out.write(out)

これにより、辞書がインプレースで変更されます。

各エントリからキーareaとキーを決定することもできます。type

    for data in datas:
        keys = sorted(data.keys())

        area_keys = [k for k in keys if k.startswith('area')]
        data['area'] = [data[k] for k in area_keys]

        type_keys = [k for k in keys if k.startswith('type')]
        data['type'] = [data[k] for k in type_keys]

        for k in area_keys + type_keys:
            del data[k]

そして、ハードコードされたリストなどのリストリテラルを'area1', 'area2'完全に省略します。

于 2013-01-25T17:53:14.213 に答える
4

キーを順番に繰り返します。

for k, v in sorted(data.iteritems()):

これは、9を超えると失敗しますが、今のところは失敗します。

于 2013-01-25T17:54:23.887 に答える