带if语句的Python for循环

带if语句的Python for循环,python,logic,arcgis,calculated-columns,arcpy,Python,Logic,Arcgis,Calculated Columns,Arcpy,此代码将用于附加光栅单元计数的多边形数据。例如,如果光栅是土地覆盖,则每个土地覆盖类型都有一列,每个多边形中都有相应的单元数。这个输出来自地理空间建模环境,因为表格光栅一直在我使用的大型ShapeFile上崩溃。最终我想要的是面积值,而不是单元格计数,这是下面的代码将实现的 因此,代码将遍历shapefile属性,拉出原始计数字段,然后根据用户输入创建新字段(使用用户输入名称+光栅值遍历AddField以获得新字段名称),然后遍历原始字段的值并为新字段计算用户指定的区域值。本质上,我试图自动添加

此代码将用于附加光栅单元计数的多边形数据。例如,如果光栅是土地覆盖,则每个土地覆盖类型都有一列,每个多边形中都有相应的单元数。这个输出来自地理空间建模环境,因为表格光栅一直在我使用的大型ShapeFile上崩溃。最终我想要的是面积值,而不是单元格计数,这是下面的代码将实现的

因此,代码将遍历shapefile属性,拉出原始计数字段,然后根据用户输入创建新字段(使用用户输入名称+光栅值遍历AddField以获得新字段名称),然后遍历原始字段的值并为新字段计算用户指定的区域值。本质上,我试图自动添加字段,计算字段模型,我通常在ModelBuilder中批处理该模型

我很难找出计算新字段的正确逻辑。正如现在编写的那样,它使用for循环获取原始字段,但最终只使用最后一个原始字段值,并且只填充最后一个新字段。我需要循环获取第一个原始字段并将其放入相应的新字段中,这样:

如果origFields=('NLCDV1','NLCDV2'…) 和addedFields=('KM2\u LC1'、'KM2\u LC2'…) 然后addField计算将以适当的值结束: “KM2_LC1”=转换(其中转换=!NLCDV1!*单元格) 对于可能存在的所有值,“KM2_LC2”=convert(convert=!NLCDV2!*单元格),依此类推

#User inputs the desired final units, loop through to find the desired units and calculates the new fields.
unit = arcpy.GetParameterAsText(7) #Must be: SqMeter, SqKm, Acres, Hectares, SqMi, or SqFt.

#User must know original units of raster, must be in Meters or Foot_US!!!
for field in origFields:

  if rastunit == "Meter":
    #To make square meters final area unit.
    if unit == "SqMeter":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

    #To convert square meters into Square Kilometers.
    elif unit == "SqKm":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqkm, "PYTHON_9.3")

    #To convert square meters into Acres.
    elif unit == "Acres":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmac, "PYTHON_9.3")

    #To convert square meters into Hectares.
    elif unit == "Hectares":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmhec, "PYTHON_9.3")

    #To convert square meters into Square Miles.
    elif unit == "SqMi":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqmi, "PYTHON_9.3")

    #To convert square meters into Square Feet.
    elif unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqft, "PYTHON_9.3")
    else:
      print arcpy.AddWarning("Ineligible unit provided.")


  elif rastunit == "Foot_US":
    #To make square feet final area unit.
    if unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

  else:
    print "This raster has the following units:" +rastunit+ ". If not in Foot_US or Meters, please reproject the raster."
我只需要弄清楚如何获得相应的原始字段以匹配新添加的字段。我在考虑使用类似zip的东西(origField、addedField、calcs)。当我这样做时,它给了我以下输出:

(u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0')
(u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0')
(u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0')
(u'NLCDV4', 'KM2_LC4', '!NLCDV4! * 900.0')
(u'NLCDV5', 'KM2_LC5', '!NLCDV5! * 900.0')
(u'NLCDV7', 'KM2_LC7', '!NLCDV7! * 900.0')
(u'NLCDV8', 'KM2_LC8', '!NLCDV8! * 900.0')
(u'NLCDV9', 'KM2_LC9', '!NLCDV9! * 900.0')
这些行正是我所需要的,但我不确定是否可以使用这些输出来填充字段,即使可以使用它们,我对python和zip都是新手,所以我不知道如何使用它们

如果您对逻辑有任何帮助,我们将不胜感激,欢迎您提出任何关于清理/重新订购的建议。就像我说的,我是一个新手,当这一切都结束了。一旦我有了逻辑,我就可以走了!感谢您的关注,如果我的代码过于复杂,请向您道歉(如果是这样的话,您不会感到惊讶)。

我(仍然)不确定是否理解您的要求,但这可能会有所帮助:

origFields = (u'NLCDV1', u'NLCDV2', u'NLCDV3')
addedFields = ('KM2_LC1', 'KM2_LC2', 'KM2_LC3')
calcs = ('!NLCDV1! * 900.0', '!NLCDV2! * 900.0', '!NLCDV3! * 900.0')

for orig, added, calc in zip(origFields, addedFields, calcs):
    print '{!r}, {!r}, {!r}'.format(orig, added, calc)
输出:

u'NLCDV1','KM2\u LC1','!NLCDV1!*900.0'
u'NLCDV2','KM2_LC2','!NLCDV2!*900.0'
u'NLCDV3'、'KM2_LC3'、'!NLCDV3!*900.0'

请简化您的代码和问题。另外,代码的缩进看起来很糟糕。我删除了大部分代码,只留下了我一直坚持的for循环。希望这是令人愉快的。为了澄清这一点,当我在PythonWin中调试它并运行整个脚本时,缩进就可以正常运行了。它读取光栅单位,选择适当的if语句,然后选择与用户输入的单位匹配的if语句。非常感谢!工作得很有魅力。下次我有问题的时候,我会尽量说得更清楚。除了仍在学习逻辑之外,还在研究如何在日常对话中使用Python术语。