我有两个看起来像这样的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 )
答案 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时,这个解决方案很简单易行。 (最后,你可能想看看熊猫,例如。)