하위 목록의 두 번째 값이 없음 인 경우 상위 목록에서 제외하려고하지만 범위를 벗어난 색인 오류가 발생합니다. 여기 해당 하위 목록이 조건을 충족하는 경우 Python의 목록에서 하위 목록을 삭제해야합니다.
Error:
Runtime error
Traceback (most recent call last):
File "<string>", line 2, in <module>
IndexError: list index out of range
listSeq=[[134, None, datetime.datetime(2016, 2, 12, 0, 0)], [135, None, datetime.datetime(2016, 2, 12, 0, 0)], [136, None, datetime.datetime(2016, 2, 12, 0, 0)], [138, 1, datetime.datetime(2016, 2, 12, 0, 0)], [139, None, datetime.datetime(2016, 2, 12, 0, 0)], [140, None, datetime.datetime(2016, 2, 12, 0, 0)], [141, None, datetime.datetime(2016, 2, 12, 0, 0)], [142, 3, datetime.datetime(2016, 2, 12, 0, 0)], [144, None, datetime.datetime(2016, 2, 12, 0, 0)], [145, 2, datetime.datetime(2016, 2, 12, 0, 0)]]
for x in range(len(listSeq)):
if listSeq[x][1]!=None:
listSeq.pop(x)
내가 사용하는 솔루션이며 나는 단지 두 번을 테스트 한 나는 아직도 제대로 작동하는지 확인하기 위해 기록을 검토하고 있지만, 그것은 지금까지 작동합니다.
import datetime
import arcpy
import os
arcpy.env.overwriteOutput=True
mxd=arcpy.mapping.MapDocument("CURRENT")
outWrkspc=r"c:\Project_Status"
fields=["RNG","SEC","STD_DESCRIPTION","AREA_SF"]
df=arcpy.mapping.ListDataFrames(mxd,"Layers")[0]
listLayers=arcpy.mapping.ListLayers(mxd,"LD_BOUNDARY_POLY",df)[0]
nameDate=datetime.date.today()
dupTable=os.path.join(outWrkspc,str(listLayers)+"_"+str(nameDate))
arcpy.FindIdentical_management("LD_BOUNDARY_POLY",dupTable,fields,output_record_option="ONLY_DUPLICATES")
arcpy.AddJoin_management("LD_BOUNDARY_POLY","OBJECTID",dupTable,"IN_FID")
listSeq=[]
maxId=[]
keepId=[]
keepListIndex=[]
cursor=arcpy.da.SearchCursor("LD_BOUNDARY_POLY","*")
for row in cursor:
listSeq.append([row[0],row[-1],row[-18]])
for x in range(len(listSeq)):
if listSeq[x][1]is not None:
keepId.append(listSeq[x])
for x in keepId:
if not x[1] in keepListIndex:
keepListIndex.append(x[1])
for z in keepListIndex:
currenTimetList=[]
for y in keepId:
if z==y[1]:
currenTimetList.append(y[2])
maxTime=max(currenTimetList)
maxId.append([maxTime,z])
delList=[]
for x in maxId:
for n in keepId:
if x[0]!=n[2] and x[1]==n[1]:
delList.append(n[0])
arcpy.RemoveJoin_management("LD_BOUNDARY_POLY")
for x in delList:
whereClause="""OBJECTID = %s"""%x
with arcpy.da.UpdateCursor("LD_BOUNDARY_POLY","OBJECTID",whereClause) as uc:
for row in uc:
uc.deleteRow()
항목을 삭제하면 목록이 짧아집니다. 그래서 x의 마지막 반복은 끝에서 벗어날 것입니다. –
두 번째 값으로 None을 사용하여 목록을 팝하려면. 두 번째 값이 None이 아닌 곳을 터뜨리는 대신이 작업을 수행해야합니다. – DahliaSR