繁体   English   中英

Python IndexError:列表索引超出范围没有意义

[英]Python IndexError: list index out of range doesn't make sense

我正在编写一个小的 python 代码,它解析来自谷歌地图 API 的响应,但是我收到了一个“IndexError: list index out of range”错误,这对我来说没有任何意义。 对于某些请求,代码有效,而对于其他一些请求,代码无效。

代码的目的是构造对随机地址的地址响应,并将其放入 dict 结构中以备后用。

我检查了列表的范围(例如计数到 n-1),但这似乎不是问题。

Exact traceback:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "geoCodeAPI.py", line 67, in getLocation
    data[i] = {'formatted_address': formattedAddress[i], 'street': streetname[i], 'street_number': streetnumber[i], 'city': city[i], 'country': country[i], 'lat': lat[i], 'lng': lng[i]}
IndexError: list index out of range

高度赞赏对代码的任何建议和一般评论。 谢谢你。

#!/usr/bin/python
import urllib
import json

jsonResponse = ''

def getLocation(rawAddressString):

    addressString = rawAddressString.replace(" ", "+");
    url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + addressString+ "&sensor=false";

    googleResponse = urllib.urlopen(url);
    result = json.load(googleResponse)

    formattedAddress = []
    lat = []
    lng = []
    country = []
    streetnumber = []
    streetname = []
    city = []


    for s in result['results']:
        formattedAddress.append(s['formatted_address'])
        lat.append(s['geometry']['location']['lat'])
        lng.append(s['geometry']['location']['lng'])

        for foo in s['address_components']:
            if foo['types'][0] == "country":
                country.append(foo['long_name'])
            else:
                country.append("NA")
            if foo['types'][0] == "street_number":
                streetnumber.append(foo['long_name'])
            else:
                streetnumber.append("NA")
            if foo['types'][0] == "route":
                streetname.append(foo['long_name'])
            else:
                streetname.append("NA")
            if "locality" in foo['types'][0]:
                city.append(foo['long_name'])
            else:
                city.append("NA")
        data = dict()

        print range(len(country))
        print range(len(city))

        for i in (range(len(country))):
            data[i] = {'formatted_address': formattedAddress[i], 'street': streetname[i], 'street_number': streetnumber[i], 'city': city[i], 'country': country[i], 'lat': lat[i], 'lng': lng[i]}

    return data

您的列表大小不同。 虽然formattedAddress, latlngresult['results']具有相同的大小,但在内循环中创建了列表country, streetnumber, streetnamecity ,每个s['addresscomponents']一个元素。 如果您检查一下,可能会为每个formattedAddress创建多个"NA"国家/地区(每个地址元素都不是国家/地区)。 因此,如果您遍历country的长度,则会溢出formattedAddress

这对我有用:

    for s in result['results']:
        formattedAddress.append(s['formatted_address'])
        lat.append(s['geometry']['location']['lat'])
        lng.append(s['geometry']['location']['lng'])
        country.append("NA")
        streetnumber.append("NA")
        streetname.append("NA")
        city.append("NA")

        for foo in s['address_components']:
            if foo['types'][0] == "country":
                country[-1] = foo['long_name']
            if foo['types'][0] == "street_number":
                streetnumber[-1] = foo['long_name']
            if foo['types'][0] == "route":
                streetname[-1] = foo['long_name']
            if "locality" in foo['types'][0]:
                city[-1] = foo['long_name']
        data = dict()

不知道是不是只有这里显示的错误,但是

else:
country.append("NA")

似乎没有正确的缩进,因此无论条件如何,它都会每次执行,并且您的国家/地区列表比任何其他列表都长......

我还注意到当我数据中某个点的地址错误时会发生此错误。 因此,包含一个“ty-except”块将有助于捕获 IndexError(或任何其他错误)并允许您的代码继续运行。

例子:

try:
     'Your Code' 
except IndexError:
        print("Wrong Address!")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM