Python select JSON中的特定元素返回错误的结果[get location的code函数]

2024-06-16 12:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我正在编写一个函数,用于将地址数组(包括street name、ward name、district name和city name)转换为一个对象,该对象显示上述每个数组元素的位置代码(street code、ward code、district code和city code来自json文件)

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

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

目前正在处理一个示例(数组可以随机排序,比如只有3个元素,或者4个元素或元素随机排序,这就是我使用for循环搜索的原因)location的数组如下:

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

输出:

{'Đường Lê Quang Định': street_code, 'Phường 11': ward_code, 'Bình Thạnh': district_code, 'Hồ Chí Minh': city_code}

或者可能是这样:

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

输出:

{'Phường 11': ward_code,'Đường Lê Quang Định': street_code, 'Bình Thạnh': district_code, 'Hồ Chí Minh': city_code}

或者这个:

['Đường Lê Quang Định','Bình Thạnh', 'Hồ Chí Minh']

输出:

{'Đường Lê Quang Định': street_code, 'Bình Thạnh': district_code, 'Hồ Chí Minh': city_code}

或者一些随机编号(如果在JSON find中找不到,则返回空字符串):

['house number 35', 'Đường Lê Quang Định','Bình Thạnh', 'Hồ Chí Minh']

输出:

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

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

json文件包含位置代码(代码)_地址.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
        }
      }
    }
  }
}

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

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位置的代码中,一些ward和street名称将重复,但它属于不同的城市

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

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

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

预期的正确结果应为:

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

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

编辑: 我编辑了我的问题来更详细地描述这个函数在做什么,它从一个JSON文件中获取地址的任何输入数组并查找类似的位置代码

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


Tags: namestreetcityvaluecode数组chng
2条回答

您工作太辛苦了:使用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_codeward_codecity_code
  • 使用这些代码,我们可以构造converted字典,这就是您想要的。你知道吗
  • 如果由于某种原因,arrs中的数据是错误的,那么我们将遇到一个KeyError,消息应该告诉我们哪个信息(城市、地区,…)没有找到

希望这能帮助你达到你需要的地方。它将每个不同的城市添加到一个列表中。你知道吗

city_list = []

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)

    for x in j_data:
        new_cities = {}
        city_name = x
        city_code = (j_data[x]['cityCode'])

        for d_name in j_data[x]['districts']:
            district_name = d_name
            district_code = (j_data[x]['districts'][d_name]['districtCode'])

        for w_name,w_code in j_data[x]['districts'][d_name]['wards'].items():
            if w_name in arrs:
                ward_name = w_name
                ward_code = w_code

        for s_name,s_code in j_data[x]['districts'][d_name]['streets'].items():
            if s_name in arrs:
                street_name = s_name
                street_code = s_code

        new_cities.update({city_name: city_code, district_name: district_code, ward_name: ward_code, street_name: street_code})
        city_list.append(new_cities)

loopJson()

print(city_list)

相关问题 更多 >