FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"] Iteration = 0 Iteration2 = 0 if TABLETYPE == "Animal Operations": for JoinFile in UPDATELIST_join: if Iteration > 2: Iteration = 0 Iteration2 = Iteration2 + 1 layer = CENSUSLayerLIST[Iteration] ANOPSFIELD = FieldNameList[Iteration2] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.CalculateField_management(layer, ANOPSFIELD, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1 else: for layer in CENSUSLayerLIST: JoinFile = UPDATELIST_join[Iteration] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.CalculateField_management(layer, CENSUSFIELDTRANS, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1
Solved! Go to Solution.
Now, just so that I understand what is happening here,
Code:valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
valueDict = { field_1 : [ field_2, field_3, field_4] }
is building an array from which
Code:with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
the current cursor row searches for a match. And
Code:
row[1] = valueDict[GEOIDval][0]
means the value of the update cursor row's second field (row[1]) now equals the matched object's next value from the matched part (valueDict[GEOIDval][0]). Correct?
SCRIPTPATH = sys.path[0] ROOTFOLDER = os.path.dirname(SCRIPTPATH) CENSUS_FGDB = os.path.join(ROOTFOLDER, "CENSUS.gdb") Census_Blocks = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_BLOCKS") Census_Group = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_GROUP") Grid = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_GRID") CENSUSLIST = [Census_Blocks, Census_Group, Grid] TABLETYPE = arcpy.GetParameterAsText(0) UPDATELAYER = arcpy.GetParameterAsText(1) UPDATEFIELD = arcpy.GetParameterAsText(2)# optional CENSUSFIELD = arcpy.GetParameterAsText(3)# optional usrName = os.getenv('USERNAME') HOME = r'C:\Users\%s' % usrName if CENSUSFIELD == "Buildings": CENSUSFIELDTRANS = "BLDCNT" elif CENSUSFIELD == "Chemical Sites": CENSUSFIELDTRANS = "CHEMICAL" elif CENSUSFIELD == "Correctional Facilities": CENSUSFIELDTRANS = "CORRECT" elif CENSUSFIELD == "Dams": CENSUSFIELDTRANS = "DAMS" else: pass if UPDATEFIELD =='#' or not UPDATEFIELD: UPDATEFIELD = "NOTUSED" DEFAULTGDB = os.path.join(HOME, "Documents", "ArcGIS", "Default.gdb") UPDATELAYERTemp = (os.path.join(DEFAULTGDB, "UPDATELAYERTemp")) desc = arcpy.Describe(UPDATELAYER) type = desc.shapeType arcpy.CopyFeatures_management(UPDATELAYER, UPDATELAYERTemp) # List Fields and delete unnecessary fields = arcpy.ListFields(UPDATELAYERTemp) fieldNameList = [] for field in fields: if not field.required and not field.name == UPDATEFIELD: fieldNameList.append(field.name) arcpy.DeleteField_management(UPDATELAYERTemp, fieldNameList) arcpy.AddField_management(UPDATELAYERTemp,"Number","SHORT") arcpy.CalculateField_management(UPDATELAYERTemp,"Number",1,"PYTHON_9.3") # Define Animal Operations ANOPCATTLE = (os.path.join(DEFAULTGDB, "ANOPCATTLE")) ANOPDAIRY = (os.path.join(DEFAULTGDB, "ANOPDAIRY")) ANOPPOULTRY = (os.path.join(DEFAULTGDB, "ANOPPOULTRY")) ANOPSWINE = (os.path.join(DEFAULTGDB, "ANOPSWINE")) exp1 = "\"" + UPDATEFIELD + "\" LIKE '%Dry%' OR \"" + UPDATEFIELD + "\" LIKE '%Beef%'" exp2 = "\"" + UPDATEFIELD + "\" LIKE '%Dairy%' OR \"" + UPDATEFIELD + "\" LIKE '%Milk%'" exp3 = "\"" + UPDATEFIELD + "\" LIKE '%Poultry%'" exp4 = "\"" + UPDATEFIELD + "\" LIKE '%Swine%'" # Define Census Layers CENSUS_Blocks_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Blocks_Layer")) CENSUS_Group_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Group_Layer")) CENSUS_Grid_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Grid_Layer")) CENSUSLayerLIST = [CENSUS_Blocks_Layer, CENSUS_Group_Layer, CENSUS_Grid_Layer] # Make Feature Layers from Census Iteration = 0 for layer in CENSUSLIST: Newlayer = CENSUSLayerLIST[Iteration] arcpy.MakeFeatureLayer_management(layer, Newlayer) Iteration = Iteration + 1 #Define Spatial Join outputs for UPDATELIST_join = [] CENSUS = ["Blocks", "Group", "Grid"] if TABLETYPE == "Animal Operations": arcpy.Select_analysis(UPDATELAYERTemp, ANOPCATTLE, exp1) arcpy.Select_analysis(UPDATELAYERTemp, ANOPDAIRY, exp2) arcpy.Select_analysis(UPDATELAYERTemp, ANOPPOULTRY, exp3) arcpy.Select_analysis(UPDATELAYERTemp, ANOPSWINE, exp4) JOINLAYERList = [ANOPCATTLE, ANOPDAIRY, ANOPPOULTRY, ANOPSWINE] else: JOINLAYERList = [UPDATELAYERTemp] if TABLETYPE == "Lagoons": field_name = UPDATEFIELD CENSUSFIELDTRANS = "LAGOONS" else: field_name = "Number" for file in JOINLAYERList: Iteration = 0 for layer in CENSUSLayerLIST: Export_Output = file + "_" + CENSUS[Iteration] UPDATELIST_join.append(Export_Output) fieldmappings = arcpy.FieldMappings() fieldmappings.addTable(layer) fieldmappings.addTable(file) FieldIndex = fieldmappings.findFieldMapIndex(field_name) fieldmap = fieldmappings.getFieldMap(FieldIndex) field = fieldmap.outputField field.name = "NumCount" field.aliasName = "NumCount" fieldmap.outputField = field fieldmap.mergeRule = "sum" fieldmappings.replaceFieldMap(FieldIndex, fieldmap) for field in fieldmappings.fields: if field.name not in ["NumCount", "GEOID10_1", "GEOID10_3"]: fieldmappings.removeFieldMap(fieldmappings.findFieldMapIndex(field.name)) arcpy.SpatialJoin_analysis(layer, file, Export_Output, "#","#", fieldmappings) with arcpy.da.UpdateCursor(Export_Output, "NumCount") as cursor: for row in cursor: if row[0] is None: cursor.deleteRow() Iteration = Iteration + 1 FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"] Iteration = 0 Iteration2 = 0 if TABLETYPE == "Animal Operations": for JoinFile in UPDATELIST_join: if Iteration > 2: Iteration = 0 Iteration2 = Iteration2 + 1 layer = CENSUSLayerLIST[Iteration] ANOPSFIELD = FieldNameList[Iteration2] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.AddMessage("Updateing " + layer + "' " + ANOPSFIELD) arcpy.CalculateField_management(layer, ANOPSFIELD, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1 else: for layer in CENSUSLayerLIST: JoinFile = UPDATELIST_join[Iteration] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.AddMessage("Updateing " + layer + "' " + CENSUSFIELDTRANS) arcpy.CalculateField_management(layer, CENSUSFIELDTRANS, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1
FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"] Iteration = 0 Iteration2 = 0 if TABLETYPE == "Animal Operations": for JoinFile in UPDATELIST_join: if Iteration > 2: Iteration = 0 Iteration2 = Iteration2 + 1 layer = CENSUSLayerLIST[Iteration] ANOPSFIELD = FieldNameList[Iteration2] readList = ["GEOID10_1", "NumCount"] valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)} updateList = ["GEOID10_1", ANOPSFIELD] with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row) Iteration = Iteration + 1 else: for layer in CENSUSLayerLIST: JoinFile = UPDATELIST_join[Iteration] readList = ["GEOID10_1", "NumCount"] valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)} updateList = ["GEOID10_1", CENSUSFIELDTRANS] with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row) Iteration = Iteration + 1
valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
row[1] = valueDict[GEOIDval][0]
Now, just so that I understand what is happening here,
Code:valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
valueDict = { field_1 : [ field_2, field_3, field_4] }
is building an array from which
Code:with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
the current cursor row searches for a match. And
Code:
row[1] = valueDict[GEOIDval][0]
means the value of the update cursor row's second field (row[1]) now equals the matched object's next value from the matched part (valueDict[GEOIDval][0]). Correct?