有没有更好的方法来用int

时间:2020-10-22 06:07:45

标签: python

我想根据一组整数返回一个字符串。如:
A:0-9
B:10-19
C:20-49
D:50-100

如果我给出一个整数13,它在10到19之间,因此应该返回“ B”。

如果给定一个int 31,则它应该返回“ C”,因为31在20到49之间。

if语句是否比下面更好?

def func(x):
    if 0<=x<=9:
        return "A"
    elif 10<=x<=19:
        return "B"
    ...

3 个答案:

答案 0 :(得分:2)

解决方案

以下解决方案使用 list-comprehension + dict 生成所需的内容。但是,如果您有许多值,则可能还需要检查每个值是否已正确分类。为此,我建议您改用dict

代码:示例

# define rules as a dict
rules = {
    'A': [0, 9],
    'B': [10, 19],
    'C': [20, 49],
    'D': [50, 100], 
}

# use a list comprehension: one-line solution
[k for k, v in rules.items() if (min(v) <= x <= max(v))]

代码:输出字典列表

这是一个快速的健康检查。

values = [0, 8, 9, 12, 15, 19, 20, 30, 45, 49, 50, 60, 80, 100]
[dict((x, k) for k, v in rules.items() if (min(v) <= x <= max(v))) for x in values]

输出

[{0: 'A'},
 {8: 'A'},
 {9: 'A'},
 {12: 'B'},
 {15: 'B'},
 {19: 'B'},
 {20: 'C'},
 {30: 'C'},
 {45: 'C'},
 {49: 'C'},
 {50: 'D'},
 {60: 'D'},
 {80: 'D'},
 {100: 'D'}]

另一种选择:使用pandas

# Dummy data
values = [0, 8, 9, 12, 15, 19, 20, 30, 45, 49, 50, 60, 80, 100]
df = pd.DataFrame({'data': values})

# Method-1: "df.assign" + "pd.cut"
df.assign(Rule = pd.cut(df.data, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True))

# Method-2: just "pd.cut"
df['Rule'] = pd.cut(df.data, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True)

# Method-3:
pd.cut(values, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True)

答案 1 :(得分:1)

使用if / elif语句块既直观又容易。使用elif可让您稍微简化一下语句:

def fun(x):
    if x < 0 or x > 100:
        raise Exception("What???")
    elif x < 10:
         return "A"
    elif x < 20:
         return "B"
    elif x < 50:
         return "C"
    else:
         return "D"
    

答案 2 :(得分:0)

您可以将字典与一些数学技巧结合使用,以if/else-

的形式获得非常干净的解决方案
import math

d = {
    range(0, 10): 'A',
    range(10, 20): 'B',
    range(20, 30): 'C',
    range(30, 40): 'C',
    range(40, 50): 'C',
    range(50, 60): 'D',
    range(60, 70): 'D',
    range(70, 80): 'D',
    range(80, 90): 'D',
    range(90, 100): 'D'
}

def func(x):
    minrange = (x // 10) * 10
    maxrange = math.ceil(x / 10) * 10
    return d[range(minrange, maxrange)]

这依赖于所有数字都在0到100之间的事实。请注意,如果将17除以10并对其进行底数(也就是整数除法),将得到1,再乘以10,您将得到10,这是最小范围。现在计算17 / 10的结果,得到2,乘以10,得到20-这是最大范围。因此,您得到range(10, 20),这是'A'的关键-繁荣!

这当然更适用于分布均匀的范围。

相关问题