我想根据一组整数返回一个字符串。如:
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"
...
答案 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'
的关键-繁荣!
这当然更适用于分布均匀的范围。