2017-03-22 22 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, 내부 목록은 복사되지 않습니다. 그것이 사실이라면 확실히 비효율적 일 것입니다. 리스트는 객체에 대한 참조 배열입니다. 당신이하고있는 일은 새로운 참조 목록을 만드는 것입니다. –