基于其他值定义值没有数据

时间:2014-06-25 18:20:43

标签: python dependencies populate

我有这段代码。

  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,依此类推。如果没有数据,请写入None。 结果是它写入每一行"无"这是错误的,因为我正在查看的列(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设置为整数。

2 个答案:

答案 0 :(得分:0)

根据您的评论,我想我会进一步详细说明答案以及您可能收到错误的原因。如上所述,您不应该像现在那样使用类。你想要的是:

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")

答案 1 :(得分:0)

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。然后你可以逐行进行,并为每一行运行更改函数。