Python 3.6 - IndexError:列表索引超出范围

问题描述 投票:-1回答:1

我理解“列表索引超出范围”意味着我试图引用列表之外的内容。但是,我似乎无法确定我在做什么以及如何解决它。

在我的代码中,我使用了一个从1到39(所有时间)的数字列表,我称之为“myranges”。此列表中的数字表示从2014年11月开始到2018年1月结束的月份和年份。然后我有其他列表可以帮助我使用“myranges”列表压缩我的命名约定。

这段代码在我以前运行它的时候运行得很好,但现在我只想在2017年9月到2018年1月(35到39)运行它,它给了我索引错误。

这是完整的错误:

cumulativepoints = "CumulativePatientVisits{0}_{1}_{2}".format(row[0], row[2], month_descr[myrange-1][1])

IndexError: list index out of range

显然,错误来自我的命名约定,我假设“month_desc”是我的zip列表。但是,每当我打印“month_desc”时,它对我来说都是正确的。

这是打印出来的month_desc:

[(35, 'Sep2017', 'September', 9, 'Sep', 2017), (36, 'Oct2017', 'October', 10, 'Oct', 2017), (37, 'Nov2017', 'November', 11, 'Nov', 2017), (38, 'Dec2017', 'December', 12, 'Dec', 2017), (39, 'Jan2018', 'January', 1, 'Jan', 2018)]

这是我的完整代码。有人能帮我看看我做错了什么。

import arcpy
import datetime
from datetime import timedelta
import time

#Document Start Time in-order to calculate Run Time
time1 = time.clock()

#now = datetime.datetime.now()

arcpy.env.overwriteOutput = True

#Set the workspace
from arcpy import env
env.workspace = r"C:\arcGIS_Shared\Python\CenterHeatMaps10.gdb"


#Declare variables
fc = 'Open_GoHealth_Centers'
fields = ['USER_market_id','USER_GoHealth_ID','USER_GoHealth_Center_Name', 'USER_Opening_Date', 'USER_MonthsSinceFHOpening']
fieldname = 'USER_market_id'

#Define SQL clause statement
sqlclause = (None, 'Order By USER_market_id, USER_GoHealth_ID')

# loop through market
markets = [1000]

#lists that allow for A SPECIFIC month/year to be selected and named 
myranges = [35,36,37,38,39]

monthyear = ['Sep2017','Oct2017','Nov2017','Dec2017','Jan2018','Feb2018','Mar2018','Apr2018','May2018','Jun2018','Jul2018','Aug2018','Sep2018','Oct2018','Nov2018','Dec2018','Jan2019','Feb2019','Mar2019','Apr2019','May2019','Jun2019','Jul2019','Aug2019','Sep2019','Oct2019','Nov2019','Dec2019','Jan2020','Feb2020','Mar2020','Apr2020','May2020','Jun2020','Jul2020','Aug2020','Sep2020','Oct2020','Nov2020','Dec2020','Jan2021','Feb2021','Mar2021','Apr2021','May2021','Jun2021','Jul2021','Aug2021','Sep2021','Oct2021','Nov2021','Dec2021','Jan2022','Feb2022','Mar2022','Apr2022','May2022','Jun2022','Jul2022','Aug2022','Sep2022','Oct2022','Nov2022','Dec2022','Jan2023','Feb2023','Mar2023','Apr2023','May2023','Jun2023','Jul2023','Aug2023','Sep2023','Oct2023','Nov2023','Dec2023','Jan2024','Feb2024','Mar2024','Apr2024','May2024','Jun2024','Jul2024','Aug2024','Sep2024','Oct2024','Nov2024','Dec2024','Jan2025','Feb2025','Mar2025','Apr2025','May2025','Jun2025','Jul2025','Aug2025','Sep2025','Oct2025','Nov2025','Dec2025']
monthname = ['September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December',]
monthnum = [9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12]
monthabbr = ['Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
year = [2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,   2019,   2019,   2019,2020,2020,2020,2020,2020,2020,2020,2020,   2020,   2020,   2020,2020,2021,2021,2021,2021,2021,2021,2021,   2021,   2021,   2021,   2021,   2021,2022,2022,2022,2022,2022,2022,2022,2022,   2022,   2022,   2022,   2022,2023,2023,2023,2023,2023,2023,2023,2023,   2023,   2023,   2023,   2023,2024,2024,2024,2024,2024,2024,2024,2024,   2024,   2024,   2024,   2024,2025,2025,2025,2025,2025,2025,2025,2025,   2025,   2025,   2025,   2025]

month_description = zip(myranges,monthyear,monthname,monthnum,monthabbr,year)
month_descr = list(month_description)
print (month_descr)

#returns last day of each month
def last_day_of_month(any_day):
    next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
    return next_month - datetime.timedelta(days=next_month.day)


for market in markets:
    print (market)
    #Define WHERE clause statement
    whereclause = """{} = """.format(arcpy.AddFieldDelimiters(fc, fieldname)) + str(market)

    for myrange in myranges:
        print(myrange)
        #Cursor to create list of centers to loop through
        with arcpy.da.SearchCursor(in_table = fc, where_clause = whereclause, field_names = fields, sql_clause = sqlclause) as cursor:

            #Loop to run SummarizeWithin by center
            for row in (cursor):
                Set variables for SummarizeWithin
                #Specify type of summarization, either Blocks or ZIPS, as part of the polys argument
                polys = "Market{0}".format(row[0])+"Blocks"

                cumulativepoints = "CumulativePatientVisits{0}_{1}_{2}".format(row[0], row[2], month_descr[myrange-1][1])

                cumulativeoutFeatureClass = "CumulativeSumWithin{0}_{1}_{2}".format(row[0], row[2], month_descr[myrange-1][1])
                keepAll = 'ONLY_INTERSECTING'
                sumFields = [['USER_VisitCount', 'Sum']]
                addShapeSum = 'ADD_SHAPE_SUM'


#                    This If statement determines if the Opening_Date of the respective center is before the last day of the month being run.
#               If it is, the summarize-within is performed, if not, the feature class is skipped.
                year = month_descr[myrange-1][5]
                month = month_descr[myrange-1][3]
                if last_day_of_month(datetime.date(year, month, 1)) >= row[3].date():

                    arcpy.SummarizeWithin_analysis(in_polygons = polys, in_sum_features = cumulativepoints, out_feature_class = cumulativeoutFeatureClass, keep_all_polygons = keepAll, sum_fields = sumFields, sum_shape = addShapeSum)



                    #Print Results
                    print(row[2])
                    print(myrange)

                    print (arcpy.GetMessages())

#Document End Time
time2 = time.clock()

#Run time in second
runtime = (time2-time1)

print (str(timedelta(seconds=runtime)))
python-3.x index-error
1个回答
2
投票

由于将代码减少到仅工作一段时间,因此出现了问题。

您的问题减少到以下几点:

myranges = [35,36,37,38,39]

month_descr = [(35, 'Sep2017', 'September', 9, 'Sep', 2017), (36, 'Oct2017', 'October', 10, 'Oct', 2017),
              (37, 'Nov2017', 'November', 11, 'Nov', 2017), (38, 'Dec2017', 'December', 12, 'Dec', 2017),
              (39, 'Jan2018', 'January', 1, 'Jan', 2018)]

for myrange in myranges:
    month_descr[myrange-1][1]

在这里你循环通过myranges。第一个值是35,您在列表month_descr中使用它作为索引,它只有5个元素。

您的完整代码(1到39)有效,因为您的列表中包含39个元素,并且不会产生索引错误

© www.soinside.com 2019 - 2024. All rights reserved.