3

2つのjsonファイルがあるとします。両方をロードしてから、2番目のエントリを最初のエントリに追加できるようにしたいと思います。これには、フィールドまたはリストエントリの追加が含まれる場合があります。次の例のようなもの:

file1.json:{"fruit":[{"name": "apple"、 "color": "red"}、{"name": "orange"、 "color": "orange"}]}

file2.json:{"フルーツ":[{"名前": "イチゴ"、 "色": "赤"、 "サイズ": "小さい"}、{"名前": "オレンジ"、 "サイズ": "中くらい" } ] }

結果:{"fruit":[{"name": "apple"、 "color": "red"}、{"name": "orange"、 "color": "orange"、 "size": "medium" }、{"名前": "イチゴ"、 "色": "赤"、 "サイズ":"小さい"}]}

最初は、それらを辞書にロードして、更新のようなものを試してみようと思いました。

import simplejson

filea = open("file1.json", 'r')
dicta = simplejson.loads(filea.read())

fileb = open("file2.json", 'r')
dictb = simplejson.loads(fileb.read())

filea.close()
fileb.close()

dicta.update(dictb)

両方の辞書に「fruit」のエントリがあるので、それらがマージされることを期待していましたが、dictaのエントリをdictbのエントリで単純にオーバーライドします。

この例をループするコードを記述できることはわかっていますが、実際に使用しているファイルははるかに大きく、より複雑です。車輪の再発明を始める前に、すでにこのようなことをしている図書館があるのではないかと思っていました。その価値のために、私はPython2.6.2を使用しています。

アドバイスや提案をありがとう!

4

2 に答える 2

6

各値をチェックしてリストを拡張する必要があります。namePythonで、辞書の項目に基づいてそれらをマージする方法はありません。

def merge(lsta, lstb):
    for i in lstb:
        for j in lsta:
            if j['name'] == i['name']:
                j.update(i)
                break
        else:
            lsta.append(i)

for k,v in dictb.items():
    merge(dicta.setdefault(k, []), v)

したがって、dicta変数は次のようになります。

{'fruit': [{'color': 'red', 'name': 'apple'}, 
           {'color': 'orange', 'name': 'orange', 'size': 'medium'},
           {'color': 'red', 'name': 'strawberry', 'size': 'small'}]}
于 2012-09-05T16:02:50.313 に答える
0

リスト内の解析されたjsonが与えられた場合parsed_json:

transformed_data = []
for data in parsed_json:
    transformed_data.append({})
    for fruit in data['fruit']:
        fruit_copy = fruit.copy()
        transformed_data[-1][fruit_copy.pop('name')] = fruit_copy
merged_fruit = defaultdict(dict)
for name, values in transformed_data.iteritems():
    merged_fruit[name].update(values)

2.7+ では辞書内包表記でそれを行うことができましたが、2.6.2 と言いました。現実の世界では複数のフィールドをマージしているという声明を考えると、transformed_dataメンバーを設定するときにキーを変更して、必要なソースの任意のフィールドにすることができます。元の解析済みデータを破棄することを気にしない場合は、copy.

于 2012-09-05T16:13:44.313 に答える