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

0 投票
3 回答
7691 浏览
提问于 2025-04-16 14:31

我正在写一段小的Python代码,用来解析谷歌地图API的响应。不过我遇到了一个“IndexError: list index out of range”的错误,这让我很困惑。对于某些请求,这段代码能正常工作,但对于其他请求,就不行了。

这段代码的目的是把地址的响应整理成一个结构化的格式,然后放进一个字典里,以便后续使用。

我检查过列表的范围(比如说数到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

3 个回答

0

我也注意到,当我数据中的某个地址出错时,就会出现这个错误。所以加一个“try-except”块可以帮助捕捉到这个索引错误(或者其他错误),让你的代码继续运行下去。

举个例子:

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

你的列表大小不一样。虽然 formattedAddress, latlng 的大小和 result['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()
0

不知道这里的显示是不是有问题,但

else:
country.append("NA")

看起来缩进不对,所以无论条件如何,它都会每次执行,这样你会得到一个比其他列表都要长的国家列表……

撰写回答