2017-03-22 28 views
0

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

删除一个项目后,列表会缩短一个。所以x的最后一次迭代将会结束。 –

+1

如果你想弹出与None无关的列表作为第二个值。你应该这样做,而不是弹出第二个值不是None的那些。 – DahliaSR

回答

3

它通常是更好地使你希望保留项目的一个新的列表来过滤列表。

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] 
+0

谢谢,追加列表是我最终做的。我只是想确保没有其他办法可以阻止我拥有多个列表的列表。我最终需要做的是根据子列表中的第二个数字匹配记录,并在这些匹配中保留最新记录。所以我有4个列表和一堆循环,我试图保持简单。感谢您的回答。 –

+0

@GaryLester,不会复制内部列表。如果是这样的话,那肯定是低效的。列表只是对象的引用数组。你所做的只是创建一个新的参考列表。 –

相关问题