Python - 如果密钥匹配,则从第二个文件替换JSON文件中的值

时间:2016-02-12 11:13:06

标签: python json recursion

我有两个看起来像这样的JSON文件

{"type": "FeatureCollection", "features": [{ "type": "Feature", "properties": { **"id"**: "Carlow", **"density"**: "0" } , "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -6.58901, 52.906464 ], [ -6.570265, 52.905682 ], [ -6.556207, 52.906464 ],

第二个JSON文件

{"features": [{"**count**": 2, "name": "**Sligo**"}, {"count": 3"name":"Fermanagh"},{"count": 1, "name": "Laois"}, 

我正在尝试检查第一个文件中的“id”是否与第二个文件中的“name”匹配,如果是,请更改的值密度“到第二个文件中的”计数“的值。我正在寻找使用我在Replace value in JSON file for key which can be nested by n levels找到的类似问题的递归,但它只检查一个键是否匹配并更改值。在更改值之前,我需要两个键匹配。这是我到目前为止使用的代码,但不知道如何添加两个键和两个值。我使用Counter来计算字符串出现的次数并将其保存到county_names.json,这是我的第二个JSON文件。 ire_countiesTmp.json是我的第一个文件,我试图用第二个文件替换值。我不知道如何用Python开始学习它。任何帮助都会很棒,或者如果你知道更好的方法。感谢

import json, pprint
from collections import Counter

with open('../county_names.json') as data_file:

county_list = json.load(data_file)

for i in county_list:
    c = Counter(i for i in county_list)


for county,count in c.iteritems():

    with open('ire_countiesTmp.json') as f:

            def fixup(adict, k1, v1, k2, v2):
                for key in adict.keys():
                    if adict[key] == v1:
                        adict[key] = v
                    elif type(adict[key]) is dict:
                        fixup(adict[key], k, v)


            #pprint.pprint( data )

            fixup(data, 'id', county, 'density', count)
            pprint.pprint( data )

1 个答案:

答案 0 :(得分:0)

一般来说,递归在Python中并不是一个好主意。编译器/解释器不能很好地处理它,它变得非常慢,因为没有尾递归优化:Why is recursion in python so slow?

假设您已将JSON数据转换为dict的可能的暴力解决方案可能如下所示:

def fixup_dict_a_with_b(a, b):
    for feature_a in a["features"]:
        for feature_b in b["features"]:
            if feature_a["properties"]["id"] == feature_b["name"]:
                feature_a["properties"]["density"] = feature_b["count"]
                break

这当然可以"抽象化"按照你的喜好。 ;)

其他更优雅的解决方案存在,但是当您刚开始使用Python时,这个解决方案很简单易行。 (最后,你可能想看看熊猫,例如。)