【问题标题】:Python IndexError: list index out of range doesn't make sensePython IndexError:列表索引超出范围没有意义
【发布时间】:2011-03-27 17:45:33
【问题描述】:

我正在编写一个小 Python 代码来解析来自 google maps 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

非常感谢对代码的任何建议和一般 cmets。谢谢。

#!/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

【问题讨论】:

  • 请始终提供包含回溯的完整错误消息。
  • """得到一个 "IndexError: list index out of range" 错误,"""。老兄,请完整的回溯...
  • 抱歉获取回溯:回溯(最近一次调用最后一次):文件“”,第 1 行,在 文件“geoCodeAPI.py”,第 67 行,在 getLocation 数据中[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
  • 编辑您的问题,添加回溯并修复缩进。
  • 旁注:data 可以是字典列表。

标签: python list


【解决方案1】:

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

else:
country.append("NA")

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

【讨论】:

  • 感谢您提供缩进提示。我改变了缩进。
【解决方案2】:

您的列表大小不同。虽然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()

【讨论】:

    【解决方案3】:

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2017-04-05
      • 2012-07-15
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多