Basado en el pseudocódigo de @MichaelTodd, y lo que aparece arriba, he improvisado un poco de código que creo que va a funcionar.
En esencia, se trata con el ID que contienen un tipo de "A" en primer lugar.
1. Seleccione los ID
2. Seleccione las características que coincidan con los documentos de identidad.
3. Eliminar características en la que el Tipo <>
Siguiente, de acuerdo con las características que no contienen un Tipo A. Esta ahora solo debería incluir características que no estaban en el primer set, ya que los que se han eliminado.
1. Seleccione el ID del Tipo <>
2. El paso a través de la IDENTIFICACIÓN, la selección de características con la coincidencia de atributo
3. Recuento de las características de coincidencia de cada ID, a continuación, recorrer la eliminación de las características de hasta sólo 1 está a la izquierda.
import arcpy
arcpy.env.workspace = r"c:\Temp"
fc = "newshape.shp"
field1 = "Site_ID"
field2 = "Site_Type"
field3 = "OID"
#Setting delimiters should allow you to change source without causing problem in query strings
delimfield1 = arcpy.AddFieldDelimiters(fc,field1)
delimfield2 = arcpy.AddFieldDelimiters(fc,field2)
delimfield3 = arcpy.AddFieldDelimiters(fc,field3)
srchstring = delimfield2 + "= 'A'"
#Returns features with Site_Type = A
rowswitha = arcpy.SearchCursor(fc,srchstring,"",field1, "Site_ID A")
#Makes list of Site_ID's that have one or more feature where Site_Type = A
idswitha = []
for itemwitha in rowswitha:
idswitha.append(itemwitha.getValue(field1))
#Step through list of Features, delete features in ID list where Site_ID <> A
for idwitha in idswitha:
idstring = delimfield1 + " = " + idwitha
rowswithid = arcpy.UpdateCursor(fc,idstring)
for rowwithid in rowswithid:
if rowwithid.getValue(field2)!='A':
rowswithid.deleteRow(rowwithid)
del rowswithid, rowwithid
#Create list of features where Site_Type not equal to A
srchstring2 = delimfield2 + " <> 'A'"
fields = field3 + "; " + field1
rowsnoa = arcpy.SearchCursor(fc,srchstring2,"",fields, "Site_ID A")
#Create list of ID's where Wite_Type <>A
idsnoa = []
for itemnoa in rowsnoa:
idsnoa.append(itemnoa.getValue(field1))
#Create Unique value list of IDs
setidsnoa = set(idsnoa)
#For each ID, return features, count features, then delete until deleted count leaves 1
for idnoa in idsnoa:
idnoastring = delimfield1 + " = " + idnoa
rowsnoaid = arcpy.UpdateCursor(fc, idnoastring)
#Create list to return count of items in cursor
rowcountlist = []
for rownoaid in rowsnoaid:
rowcountlist.append(rownoaid.getValue(field3))
#Get count of items in list
rowcount = len(rowcountlist)
count = 0
rowdel = rowsnoaid.next()
while count < rowcount:
rowsnoaid.deleteRow(rowdel)
rowdel = rownoaid.next()
count +=1
del rowsnoaid
He editado para añadir el elemento de la lista para devolver la cuenta para la segunda sección de la consulta. No es el código más eficiente, por lo que cualquier mejora es bienvenida.
He quitado el índice de llamada de UpdateCursor como esto no es posible. Cambiado a next()
método.