一个循环中的python从列表中追加

时间:2013-10-08 19:53:56

标签: python list for-loop

我有一个循环,我用来分配单个值,但我需要在指定值的末尾添加一个字母。是否有类似这样的工作?

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)  

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

2 个答案:

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