Мне нужно удалить подсписок из списка в Python, если этот подсписок соответствует условию
Если вторым значением в подсписке является None, я хочу удалить его из родительского списка, но я получаю индекс из-за ошибки диапазона.
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()
1 ответ
Обычно лучше отфильтровать список, создав новый список элементов, которые вы хотите сохранить.
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)]
]
listSeq[:] = [x for x in listSeq if x[1] is not None]