如果子列表中的第二个值为无,我想将其从父列表中弹出,但是我得到的索引超出了范围错误。如果该子列表满足条件,我需要从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