代码之家  ›  专栏  ›  技术社区  ›  Matt A.

Python 3.6-索引器错误:列表索引超出范围

  •  -1
  • Matt A.  · 技术社区  · 7 年前

    我理解“列表索引超出范围”意味着我试图引用列表之外的内容。然而,我似乎无法确定我在哪里做这件事,以及如何修复它。

    在我的代码中,我使用一个从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\u desc”是我的zip列表。然而,每当我打印“month\u 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)))
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   DavidG    7 年前

    由于将代码缩减为仅在某一特定时期内工作,因此出现了此问题。

    您的问题可归结为以下几点:

    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个元素,并且不会产生索引错误