2 votos

Iterar a través de una lista para usar luego usar SearchCursor para poblar la nueva lista

Tengo una clase de edificios. Cada uno tiene un número único ("BO_UNIQ"). Creo una lista de estos números únicos (1251 elementos). A continuación, quiero iterar a través de esta lista y obtener los nombres de las instalaciones de otra tabla por número de edificio. Hay varias instalaciones para cada número de edificio. Finalmente, añadiré los elementos de la lista de instalaciones a los campos de la clase de características de los edificios.

Tal y como está ahora el script iterará una vez con el da.SearchCursor

¿Qué me falta?

# Import modules
import arcpy
from arcpy import env

# Set environment
env.workspace = r"PATH\EAD Facility Names\EAD_NAMES.gdb"
env.overwriteOutput = True

# set variables
buildList = []
fieldList = ["FACIL1", "FACIL2", "FACIL3", "FACIL4", "FACIL5", "FACIL6", "FACIL7", "FACIL8"]
eadBuild = "EAD_BUILDINGS"
eadTable = "tblEADFacilities"

# populate buildList with building numbers
with arcpy.da.SearchCursor(eadBuild, ["BO_UNIQ"]) as cursor:
    for row in cursor:
        buildList.append(row[0])
        print(row)

print(buildList)
print(len(buildList))

# Iterate through list of BO#s
for build in buildList:
    with arcpy.da.SearchCursor(eadTable, ["Name"], "BO =" + str(build)) as cursor:
        for row in cursor:
            facList = []
            facList.append(row)
            print(row)
    print(build)  # Will iterate and print all elements of the buildList and not run the SearchCursor branch.

4voto

GreyCat Puntos 146

¿Por qué no simplemente "moderno" Python ( Comprensión de la lista , Comprensión de listas en Python: Explicación visual ) ?

faclist = [row for row in cursor]

o

faclist = [row[0] for row in cursor]

Mira comp. de cursor arcpy , Ejemplo de SearchCursor 2 y muchos ejemplos en GIS SE

2voto

Barry Brown Puntos 9774

La mejor práctica es utilizar una sentencia with o una comprensión de la lista para que el cursor no deje un bloqueo de esquema persistente en el caso de que su script se equivoque antes de eliminar el objeto cursor.

Tu respuesta de ejemplo funcionaría para un número limitado de registros, pero crear un nuevo cursor para cada edificio es innecesario. Pruebe a escribir los registros en un diccionario y luego utilice el diccionario para imprimir los resultados. Esto será más eficiente si aplica la misma solución a un gran número de registros.

# Creat list of buildings    
buildings = [row[0] for row in arcpy.da.SearchCursor(eadTable, ["SDE_SEWERMAN_BO_BO_UNIQ"])]

# Create dictionary with building name key indexing facility name list
fac_names = {}
with arcpy.da.SearchCursor(eadTable, ["BO", "Name"]) as cur:
    for row in cur:
        if row[0] in fac_names.keys():
            fac_names[row[0]].append(row[1])
        else:
            fac_names[row[0]] = [row[1]]

# Print facility names grouped by building number
for b in fac_names.keys():
    print '\n{}'.format(b) 
    for fac in fac_names[b]:
        print '\t{}'.format(fac)

1voto

Philip Moseman Puntos 1

Prueba esto para tu último bucle

# Iterate through list of BO#s
for build in buildList:
    with arcpy.da.SearchCursor(eadTable, ["Name"], "{0} = {1}".format("BO", build)) as cursor:
        for row in cursor:
            facList = []
            facList.append(row[0])
            print(row[0])
    print(build)

0voto

Josh Puntos 165

He conseguido que funcione creando objetos cursor individuales y moviendo el objeto facList.

# populate buildList with building numbers
cursor = arcpy.da.SearchCursor(eadBuild, ["SDE_SEWERMAN_BO_BO_UNIQ"])
for row in cursor:
    buildList.append(row)
    print(row)
del cursor
del row

print(buildList)
print(len(buildList))

# Iterate through list of BO#s
for build in buildList:
    cursor2 = arcpy.da.SearchCursor(eadTable, ["Name"], "BO =" + str(build))
    for row2 in cursor2:
        facList = []
        facList.append(row2)
        print(row2)
    del cursor2
    del row2
    print(build)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X