2016-02-12 51 views
0

我有这个样子Python的 - 从第二个文件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文件中的两个JSON文件

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

我想检查是否“ ID“在第一个文件中匹配”名称“在第二个文件中,如果是这样,将值为”密度“更改为值为从第二个文件中“计数”。我正在寻找使用我在这里找到的类似问题的递归Replace value in JSON file for key which can be nested by n levels,但它只检查一个键是否匹配并更改值。在更改值之前,我需要两个键匹配。这是我迄今为止使用的代码,但不知道如何添加两个键和两个值。我使用计数器来计算出现字符串的次数并将其保存到县第一个JSON文件county_names.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

我不明白你的代码做什么。代码中引用的'fixup'和de json文件与你的问题中的json有什么关系?你应该编辑这个代码是你问题的一个[mcve]。 –

回答

0

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

可能的蛮力的解决方案,假定您已经将您的JSON数据到一个字典看起来是这样的:

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 

当然,这可能是“abstractified”根据自己的喜好。 ;)

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

相关问题