-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)  

因此,第一个循环选择了一个大特征,并用于选择其中的较小特征。然后将大特征的名称分配给其中的较小特征,但我需要在末尾添加一个字母以保持每个较小特征的名称唯一。

4

2 回答 2

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 函数中必须做的事情。再次感谢大家的帮助!!

于 2013-10-09T23:13:55.233 回答
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 所提到的,不要两次使用相同的名称“行”,您在第一个 for 循环和内部 for 循环中使用它。您应该在 rows1 中使用 for row1,在 rows2 中使用 for row2,但您必须先定义 rows2。

于 2013-10-08T23:28:57.887 回答