【问题标题】:Defining values based on other values comes up with no Data根据其他值定义值没有数据
【发布时间】:2017-03-19 19:57:53
【问题描述】:

我有这段代码。

  class GRIDCODE:
    pass
def change(BSMPW):
if GRIDCODE == "1":
  return "BSM"
elif GRIDCODE == "3":
  return "BSE"
elif GRIDCODE == "4":
  return "BSP"
else:
  return "None"

我想要它做的是如果 a 列中的值为 1,则将 b 列填充为值 BSM 等等。如果没有数据,则写无。 结果是它写入每一行“无”,这是错误的,因为我正在查看的列 (GRIDCODE) 填充了值 1,3 和 4。

我做错了什么?

编辑:2014 年 6 月 25 日下午 4:31

我会尽量澄清:

我的桌子是这样的:

GRIDCODE     BSMPW
1            empty (that does not stand in there, its just blanc)
1            empty
3            empty
1            empty
4            empty

我希望它看起来像这样:

GRIDCODE     BSMPW
1            BSM
1            BSM
3            BSE
1            BSM
4            BSP

我之前在另一张桌子上做过这个,效果很好。 BSMPW 列设置为 TEXT,而 GRIDCODE 设置为整数。

【问题讨论】:

  • 您的意思是 BSMPW == "1" 而不是 GRIDCODE == "1"。 GRIDCODE 是一个类。
  • 除上述之外,还要确保您要比较的值 (BSMPW) 是字符串类型,如果您传递一个 int,那么它总是会失败并返回“None”。 1 != "1"。您最终如何调用此方法可能有助于澄清正在发生的任何问题。
  • 我将 GRIDCODE 定义为一个类,因为我收到一条错误消息:Global name not defined。我现在删除了class GRIDCODE: pass,它在没有错误消息的情况下工作,但仍然用无填充字段。我检查的所有值都是数字,我想用文本填充字段...我正在使用 ArcMap 和 trz 来填充 Attributetable 中的值。我在这里使用 FieldCalculator。
  • 如果您只是传递数字,那将是您的问题。您正在根据句子(类型字符串)检查数字(类型 int),因此它们永远不会等同于 true。您收到全局名称错误,因为您在 if 语句中使用 GRIDCODE 而不是 @AamirAdnan 所说的 BSMPW。
  • 我想根据 GRIDCODE(列)的单元格中的值,用 BSP、BSE、BSM 填充 BSMPW(列)中的空单元格。我只想检查,如果有1,我想将BSP写入一个空单元格,该单元格由arcmap设置为TEXT。如果我正在检查数字或字母,这样做并不重要,因为我不想替换某些东西,因为我想写 BSMPW 它需要在那里吗?还是我在这里完全错了?

标签: python dependencies populate


【解决方案1】:

Bob 和 Aamir 指出的问题是 GRIDCODE 没有任何价值,因此不能等于任何值,从而使您的 change() 函数的其余部分变得毫无意义。如果您想使用某个 GRIDCODE 值,您的代码可能如下所示。

class GRIDCODE:
  def __init__(self, BSMPW):
    self.BSMPW = BSMPW

  def getBSMPW(self):
    return self.BSMPW

def change(BSMPW):
  if BSMPW == "1":
    return "BSM"
  elif BSMPW == "3":
    return "BSE"
  elif BSMPW == "4":
    return "BSP"
  else:
    return "None"

newGrid = GRIDCODE("1")
print change(newGrid.getBSMPW())
#prints "BSM"

但是,如果我正确理解您的意思,最简单的方法是完全跳过课程并使用 CSV 模块,只要列可以转换为 CSV。然后你可以一行一行地运行每行的更改函数。

【讨论】:

  • 找错人了,哈哈。但是,阅读您的更新后,您似乎只想删除整数周围的引号,尽管我可能完全不同意。
  • 是的。错误的人。但那是(一个)问题。我摆脱了它们,它奏效了。我还将change(BSMPW) 更改为change(GRIDCODE)
  • 这也绝对有效!这是完全相同的解决方案,因为变量名称是任意的。请务必记住这一点,以免您感到困惑。甚至可能值得将名称更改为 gc_bsmpw 或类似名称,因此很明显您没有在此处引用 GRIDCODE 类。无论如何,很乐意为您提供帮助,并感谢您给我的第一个声誉!
【解决方案2】:

根据您的 cmets,我想我会进一步详细说明答案以及您可能会收到错误的原因。正如所讨论的,你不应该需要这个类,因为它现在没有被使用。您想要的是以下内容:

def change(BSMPW):
    if BSMPW == "1":
        return "BSM"
    elif BSMPW == "3":
        return "BSE"
    elif BSMPW == "4":
        return "BSP"
    else:
        return "None"

注意到我们现在如何打开 BSMPW,而不是 GRIDCODE。您正在打开一个不存在的变量(这可能是它之前抛出全局错误的原因)。由于它从不等同于您给定的任何情况,因此它总是不返回任何内容。但是,您的代码中仍然存在一个问题,我也想在这里表达一下。

如果你传递一个 int 值,它总是不会给你任何值。这是因为您正在尝试将整数与字符串进行比较。下面的例子稍微阐述一下:

change(1)
>> None
change("1")
>> BSM

如果你传递一个整数,那么你需要将它与整数进行比较。因此,您需要将代码更改为:

def change(BSMPW):
    if BSMPW == 1:
        return "BSM"
    elif BSMPW == 3:
        return "BSE"
    elif BSMPW == 4:
        return "BSP"
    else:
        return "None"

但是,如果您希望成为“pythonic”并实现高效的 switch 语句,您可能需要执行以下操作(再次与字符串进行比较时添加引号):

def change(BSMPW):
    switch = {1 : "BSM",
              3 : "BSE",
              4 : "BSP"}
    return switch.get(BSMPW, "None")

【讨论】:

  • 你好,鲍勃。谢谢你的努力。我编辑了我的问题以澄清它
猜你喜欢
  • 2021-09-25
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2022-07-28
  • 2023-02-23
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多