Python在JSON中选择特定元素会返回错误结果[获取位置的代码功能]

时间:2019-06-10 03:14:21

标签: python json

您好,我目前正在编写一个函数,将包含街道名称,病房名称,区域名称和城市名称的地址数组转换为显示位置代码的对象(街道代码,区域代码,区域代码和城市代码都可以来自一个json文件)上面的每个数组元素

例如,输出对象的格式应如下所示:

  

{city_name:city_code,district_name:district_code,ward_name:   ward_code,street_name:street_code}

当前正在处理一个示例(数组可以像3个元素一样随机排序,或者我为什么要使用for循环来搜索4个元素或元素随机)这样的位置数组:

  

['ĐườngLêQuangĐịnh','Phường11','BìnhThạnh','HồChíMinh']

输出:

  

{'ĐườngLêQuangĐịnh':street_code,'Phường11':ward_code,'Bình   Thạnh':区号,'HồChíMinh':city_code}

或者可能是这样:

  

['Phường11','ĐườngLêQuangĐịnh','BìnhThạnh','HồChíMinh']

输出:

  

{'Phường11':ward_code,'ĐườngLêQuangĐịnh':street_code,'Bình   Thạnh':区号,'HồChíMinh':city_code}

或者这个:

  

['ĐườngLêQuangĐịnh','BìnhThạnh','HồChíMinh']

输出:

  

{'ĐườngLêQuangĐịnh':street_code,“BìnhThạnh”:district_code,“Hồ”   齐明(ChíMinh):city_code}

或一些随机的门牌号(如果在JSON查找中找不到,它将返回空字符串):

  

['门牌号码35','ĐườngLêQuangĐịnh','BìnhThạnh','HồChíMinh']

输出:

  

{'house number 35':'','ĐườngLêQuangĐịnh':street_code,'Bình   Thạnh':区号,'HồChíMinh':city_code}

因此数组可以是任何地址,这就是为什么我使用for循环搜索该数组中的每个元素并与JSON比较以获取该特定元素的位置代码的原因

包含位置代码的json文件(reform_address.json)超过10000行,但我将张贴我当前遇到问题的代码:

{
  "Hồ Chí Minh": {
    "cityCode":"SG",
    "districts":{
      "Bình Thạnh":{
        "districtCode":"66",
        "wards":{
          "Phường 1":"8881",
          "Phường 2":"8883",
          "Phường 3":"8884",
          "Phường 5":"8885",
          "Phường 6":"8886",
          "Phường 7":"8887",
          "Phường 11":"8889", <-correct ward_code
        },
        "streets":{
          "Đường Phạm Văn Đồng":"1433",
          "Đường Trường Sa":"1485",
          "Đường Lê Quang Định":"1428",<-- correct street_code
          "Đường Lam Sơn":"1600",
          "Đường Huỳnh Tịnh Của":"1603",
          "Đường Đống Đa":"1652",
        }
      }
    }
  }
  "Đồng Tháp":{
   "cityCode":"DDT",
   "districts":{
     "Cao Lãnh":{
       "districtCode":"721",
       "wards":{
         "Phường 1":"6898",
         "Phường 2":"6899",
         "Phường 3":"6901",
         "Phường 4":"6902",
         "Phường 6":"6903",
         "Phường 11":"6904"<- output but it's not correct ward_code
       },
       "streets":{
        "Đường Lê Quang Định":"1530", <- output but it's not correct street_code
        "Đường Nguyễn Chí Thanh":"70",
        "Đường Huỳnh Thúc Kháng":"78",
        "Đường Lê Duẩn":"89",
        "Đường Đinh Công Tráng":"99",
       }
     }
   }
  }
}

您可以看到json文件具有以下格式:

{
  city_name:{
    "cityCode": city_code,
    "district":{
      district_name:{
        "districCode": district_code,
        "wards": {
          ward_name: ward_code
        },
        "streets": {
          street_name: street_code
        }
      }
    }
  }
}

我编写的用于查找位置数组中每个元素位置的函数:

convert.py:

def loopJson():
    arrs = ['Đường Lê Quang Định', 'Phường 11', 'Bình Thạnh', 'Hồ Chí Minh']
    with open('reform_address.json','r') as jfile:
        j_data = json.load(jfile)
    a = {}
    new_cities = {}
    for value in reversed(arrs):
        for cityName in j_data.keys():
            if value == cityName:
                new_cities[value] = j_data[value]['cityCode']
            for districtName in j_data[cityName]['districts'].keys():
                if value == districtName:
                    new_cities[value] = j_data[cityName]['districts'][value]['districtCode']
                for wardName in j_data[cityName]['districts'][districtName]['wards'].keys():
                    if value == wardName:
                        new_cities[value] = j_data[cityName]['districts'][districtName]['wards'][value]
                    for streetName in j_data[cityName]['districts'][districtName]['streets'].keys():
                        if value == streetName:
                            new_cities[value] = j_data[cityName]['districts'][districtName]['streets'][value]
    a.update(new_cities)
    print(a)

loopJson()

在JSON位置的代码中,某些病房和街道名称将重复,但它们属于不同的城市

我得到的函数的返回对象是

  

{'HồChíMinh':'SG','BìnhThạnh':'66','Phường11':'6904','Đường   LêQuangĐịnh':'1530'}

该对象的第三个元素和第四个元素的位置代码错误,因为6904和1530不属于HồChíMinh市,但它位于ĐồngTháp市

预期正确的结果应该是:

  

{'HồChíMinh':'SG','BìnhThạnh':'66','Phường11':'8889','Đường   LêQuangĐịnh':'1428'}

我在做什么错?任何帮助将不胜感激:)

编辑: 我编辑了我的问题,以更详细地描述此功能的作用,即获取任何地址输入数组并从类似于JSON文件的JSON文件中查找位置代码

我忘了说输入数组在我第一次发布时可能是位置的任何随机元素,所以这是我的错

2 个答案:

答案 0 :(得分:1)

您太辛苦了:使用arrs,您就可以将密钥输入数据中,而无需使用for循环进行搜索。解决此问题的最佳方法是打开Python解释器并处理数据。这是建议的解决方案:

import json


def main():
    with open('reform_address.json') as jfile:
        data = json.load(jfile)

    arrs = ['Đường Lê Quang Định', 'Phường 11', 'Bình Thạnh', 'Hồ Chí Minh']
    street, ward, district, city = arrs

    try:
        city_code = data[city]['cityCode']
        district_code = data[city]['districts'][district]['districtCode']
        ward_code = data[city]['districts'][district]['wards'][ward]
        street_code = data[city]['districts'][district]['streets'][street]
        converted = {city: city_code, district: district_code, ward: ward_code, street: street_code}
        print(converted)
    except KeyError as e:
        print('Address not found:', e)


if __name__ == '__main__':
    main()

注释

  • 使用arrs作为密钥,我们可以直接访问city_codedistrict_code的{​​{1}},ward_codecity_code
  • 使用这些代码,我们可以构建您想要的converted字典。
  • 如果由于某种原因,arrs中的数据错误,那么我们将遇到一个KeyError,该消息应说明未找到哪条信息(城市,地区,...)

答案 1 :(得分:1)

希望这将帮助您到达需要的地方。它将每个不同的城市\字典添加到列表中。

set_issubset()