2016-02-12 49 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時,這個方法非常簡單易懂。 (最終,你可能想看看熊貓,例如。)

相關問題