【问题标题】:Is there any method to reduce code in conditional statements有什么方法可以减少条件语句中的代码
【发布时间】:2020-02-15 13:12:47
【问题描述】:

我想将上图中的代码简化为条件语句中的简短内容。在此我试图将 BHK 转换为整数值以在机器学习中使用它。

def replace_size(string):
    if string == '1 RK':
        return 0
    elif string == '1 BHK' or string == '1 Bedroom':
        return 1
    elif string == '2 BHK' or string == '2 Bedroom':
        return 2
    elif string == '3 BHK' or string == '3 Bedroom':
        return 3
    elif string == '4 BHK' or string == '4 Bedroom':
        return 4
    elif string == '5 BHK' or string == '5 Bedroom':
        return 5
    elif string == '6 BHK' or string == '6 Bedroom':
        return 6
    elif string == '7 BHK' or string == '7 Bedroom':
        return 7
    elif string == '8 BHK' or string == '8 Bedroom':
        return 8
    elif string == '9 BHK' or string == '9 Bedroom':
        return 9
    elif string == '10 BHK' or string == '10 Bedroom':
        return 10
    elif string == '11 BHK' or string == '11 Bedroom':
        return 11
    elif string == '12 BHK' or string == '12 Bedroom':
        return 12
    elif string == '13 BHK' or string =='13 Bedroom':
        return 13
    elif string == '14 BHK' or string =='14 Bedroom':
        return 14
    elif string == '16 BHK' or string =='16 Bedroom':
        return 16
    elif string == '18 BHK' or string =='18 Bedroom':
        return 18
    elif string == '19 BHK' or string =='19 Bedroom':
        return 19
    elif string == '27 BHK' or string =='27 Bedroom':
        return 27
    elif string == '43 BHK' or string =='43 Bedroom':
        return 43

我尝试使用包含“1 Bedroom”、“1 BHK”和“1 RK”的 pandas 系列,然后在系列上使用 apply(replace_size) 函数来获取 pandas 系列的 int 类型值。

谢谢1

【问题讨论】:

  • 尝试从头解析出一个数字,并有一个明确的语句来处理第一种情况
  • 你也可以定义一个字典,因为你在某种意义上模拟键查找。
  • 我正在尝试将熊猫系列 '1 Bedroom' , '1 BHK' 然后使用 apply(replace_size) 获得以下输出。

标签: python pandas numpy jupyter-notebook


【解决方案1】:

只是一个快速的想法,也许你可以使用类似的东西:

def replace_size(string):
    if string == '1 RK':
        return 0
    else:
        for i in range(1, 44):
            if str(i) in string:
                return i

到目前为止,它可能不是最好的答案,但它可能会引导您朝着正确的方向前进。 另外我不知道您可能的数据,以及是否有任何高于您提到的 43 的数字。

【讨论】:

  • 但是对于诸如“43 BHK”之类的字符串,这不会返回3,因为它会先检查"3" in string,然后再检查"43" in string
  • 是的,你是完全正确的......没有想到这一点:D 正如我所说的只是一个快速的想法。
【解决方案2】:
def replace_size(string):
    if string == '1 RK':
        return 0
    else:
        st = string.split(' ')
        return int(st[0]) if  (st[1] == "BHK" or  st[1] == "Bedroom") else None

【讨论】:

  • 我尝试使用包含'1 Bedroom'、'1 BHK'和'1 RK'的pandas系列,然后在系列上使用apply(replace_size)函数来获取pandas系列的int类型值。跨度>
  • @MaqsudInamdar 添加您正在使用 pandas 调用此函数的代码
  • 这是我用来调用函数train['size'] = train['size'].apply(replace_size)的代码,谢谢!
  • 谢谢! @Prudhvi 它现在正在工作,实际上我在列中有一些缺失值。处理丢失的列代码后,代码正在工作。编码快乐!
【解决方案3】:
import re


def replace_size(string):
    if string == '1 RK':
        return 0
    elif re.match("\d{1,2} BHK|\d{1,2} Bedroom", string):
        return int(string.split(' ')[0])

【讨论】:

    【解决方案4】:

    构建一次字典:

    d = {'1 RK':0}
    for n in range(1,44):
        d[f'{n} BHK']=n
        d[f'{n} Bedroom']=n
    
    >>> d['5 Bedroom']
    5
    

    如果你需要一个可调用的

    def f(s,d=d):
        return d[s]
    
    >>> f('5 Bedroom')
    5
    

    class D(dict):
        def __call__(self,key):
            return self[key]
    
    d = D({'1 RK':0})
    for n in range(1,44):
        d[f'{n} BHK']=n
        d[f'{n} Bedroom']=n
    
    >>> d('21 Bedroom')
    21
    

    拆分字符串,检查是否有效;返回结果。

    def g(s):
        a,b = s.split(maxsplit=1)
        if b in ('BHK','Bedroom'):
            value = int(a)
        elif b == 'RK':
            value = 0
        else:
            raise ValueError
        return value
    
    
    >>> g('1 RK')
    0
    >>> g('23 Bedroom')
    23
    >>> g('32 Foo')
    Traceback (most recent call last):
      File "<pyshell#44>", line 1, in <module>
        g('32 Foo')
      File "C:\pyProjects33\tmp.py", line 45, in g
        raise ValueError
    ValueError
    >>>
    

    在循环中构造匹配字符串:

    def f(s):
        if s == '1 RK':
            return 0
        for n in range(1,44):
            if s in (f'{n} BHK',f'{n} Bedroom'):
                return n
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2014-01-23
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多