我有一个循环,我用来分配单个值,但我需要在指定值的末尾添加一个字母。是否有类似这样的工作?
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 :(得分: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循环和内部for循环中使用它。你应该使用rows1中的row1和rows2中的row2,但你必须先定义rows2。
答案 1 :(得分: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
感谢您的帮助!我知道这可能很愚蠢,但我学到了一些新知识。 :-)我真的不得不使用%d因为我在SelectLayerByAttribute函数中必须做的事情。再次感谢大家的帮助!!