Есть ли способ уменьшить код в условных выражениях - PullRequest
0 голосов
/ 18 октября 2019

Я хочу сократить мой код на изображении выше до кратких условных выражений. В этом я пытаюсь преобразовать 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 спальня», «1 BHK» и «1 RK», а затемиспользуйте функцию apply (replace_size) для ряда, чтобы получить ряд панд значения типа int.

Thanks1

Ответы [ 4 ]

5 голосов
/ 18 октября 2019
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
0 голосов
/ 18 октября 2019

Создайте словарь один раз:

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
0 голосов
/ 18 октября 2019
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])
0 голосов
/ 18 октября 2019

Просто быстрая идея, может быть, вы могли бы использовать что-то вроде:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...