2013-10-08 8 views
-1

루프가 있습니다. 개별 값을 할당하는 데 사용하고 있지만 할당 된 값의 끝에 문자를 추가해야합니다. 이런 식으로 해결할 방법이 있습니까?목록에서 파이썬이 추가됩니다

alpha = ['a', 'b', 'c', 'd', 'e', 'f'] 
place = 0 
print alpha [%d] %place 
place = place + 1 

실제 값을 사용할 때 작동하지만 출력으로 사용될 때이 목록을 반복 할 수 있습니까? 내가 사용하고있는 코드는 ArcGIS 용이므로 아래에서 참조 할 수 있도록 붙여 넣을 것입니다.

for row in rows1: 
    name = row.getValue("Name") 
    print name 
    arcpy.SelectLayerByAttribute_management(mapLyr1, "NEW_SELECTION", '"FID" = %s' %searchrow) 
    searchrow = searchrow + 1 
    arcpy.SelectLayerByLocation_management(mapLyr2, "HAVE_THEIR_CENTER_IN", mapLyr1, 0, "ADD_TO_SELECTION") 
    for row in rows2: 
     row.tile = name + A 
     rows2.updateRow(row) 

첫 번째 루프는 큰 기능을 선택하며 그 안에 작은 기능을 선택하는 데 사용됩니다. 그런 다음 큰 지형지 물의 이름이 작은 지형지 물에 할당되지만 작은 지형지 물의 각 이름을 고유하게 유지하려면 문자를 추가해야합니다.

+0

오류가 발생하는지 잘 모르겠지만 두 번째 루프에서 행 변수를 row2로 변경하십시오. 이미 첫 번째 루프에서 행을 사용하고 있습니다. – Mike

+2

'알파 [% d] % place '프린트 할 것을 기대하고 있습니까? 그것은 원격으로 유효한 파이썬 코드조차 아니다. – abarnert

+0

나는 당신의 질문을 이해하지 못합니다. 목록의 각 요소에 고유 한 문자를 추가 하시겠습니까? 이 편지들은 어디에서 왔습니까? '알파 [% d] % place '라인 프린트가 유효하지 않습니다. 그것에 대해 더 생각해보십시오. 아마 그 줄은'print alpha [place]'여야합니다. 그게 당신의 의도인가요? – GaryO

답변

0

나는 같은 것을 할 것 :

import string 

for row in rows1: 
    name = row.getValue("Name") 
    print name 
    arcpy.SelectLayerByAttribute_management(mapLyr1, "NEW_SELECTION", '"FID" = %s' %searchrow) 
    searchrow = searchrow + 1 
    arcpy.SelectLayerByLocation_management(mapLyr2, "HAVE_THEIR_CENTER_IN", mapLyr1, 0, "ADD_TO_SELECTION") 
    for row,letter in zip(rows2,string.letters[:len(rows2)]): 
     row.tile = name + letter 
     rows2.updateRow(row) 

그러나이 rows2 일을 해결해야합니다. 그것은 어디에도 정의되어 있지 않습니다. 또한 @Mike가 언급 한 것처럼 동일한 이름 인 "row"를 두 번 사용하지 마십시오. 첫 번째 for 루프와 inner for 루프에서 두 번째를 사용합니다. rows1의 row1과 rows2의 row2에 사용해야하지만, 먼저 rows2를 정의해야합니다.

0

대답은 변수를 목록 색인 위치 지정기에 직접 입력하는 것이 었습니다. 네가 할 수 있다는 것을 나는 몰랐다. 스크립트의 시작 부분에 'place'를 추가하여 항상 0으로 시작한 다음 if 문을 추가하여 16 번으로 반복됩니다. 각 대형 피쳐 안에 16 개의 작은 피쳐가 있으므로 계속 유지합니다. 인덱스가 범위를 벗어나지 않고 마지막 스크립트입니다.

import arcpy, os 

#set map doc and the layer to be used 
mxd = arcpy.mapping.MapDocument("Current") 
mapLyr1 = arcpy.mapping.ListLayers(mxd, "NEW_BiState_Grid400_IowaSP") [0] 
mapLyr2 = arcpy.mapping.ListLayers(mxd, "GridIndexFeatures20") [0] 

#alpha will be assigned a letter to rows2 update, there are 16 
place = 0 
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'] 
name = str() 
searchrow = 0 
rows1 = arcpy.SearchCursor(mapLyr1, "", "", "Name") 
rows2 = arcpy.UpdateCursor(mapLyr2, "", "", "tile") 
rows = arcpy.UpdateCursor(mapLyr2) 
for row in rows1: 
    name = row.getValue("Name") 
    print name 
    arcpy.SelectLayerByAttribute_management(mapLyr1, "NEW_SELECTION", '"FID" = %s' %searchrow) 
    searchrow = searchrow + 1 
    arcpy.SelectLayerByLocation_management(mapLyr2, "HAVE_THEIR_CENTER_IN", mapLyr1, 0, "ADD_TO_SELECTION") 
    for row in rows2: 
     row.tile = name + alpha[place] 
     rows2.updateRow(row) 
     place = place + 1 
     if place == 16: 
      place = 0 
del mxd, rows, rows1, rows2, searchrow 

감사합니다. 나는 아마 그것이 매우 어리 석다는 것을 알고있다. 그러나 나는 새로운 무엇인가를 배웠다. :-) 정말 SelectLayerByAttribute 함수에서 수행해야했던 작업 때문에 % d을 사용해야했습니다. 다시 한 번 도움을 주신 모든 분들께 감사드립니다 !!