Python 是否有更好的方法将字符串映射为int

Python 是否有更好的方法将字符串映射为int,python,Python,我想根据一组整数返回一个字符串。例如: A:0-9 B:10-19 C:20-49 D:50-100 如果我给一个int 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"

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

如果我给一个int 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"
    ...
def func(x):

if 0使用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"
    
def fun(x):
如果x<0或x>100:
引发异常(“什么?”)
elif x<10:
返回“A”
elif x<20:
返回“B”
elif x<50:
返回“C”
其他:
返回“D”

您可以使用dict和一些数学技巧,通过
if/else
-

导入数学
d={
范围(0,10):“A”,
范围(10,20):“B”,
范围(20,30):“C”,
范围(30,40):“C”,
范围(40,50):“C”,
范围(50,60):“D”,
范围(60,70):“D”,
范围(70,80):'D',
范围(80,90):'D',
范围(90100):'D'
}
def func(x):
最小范围=(x//10)*10
最大范围=数学单元(x/10)*10
返回d[范围(最小范围,最大范围)]
这取决于所有数字都在0到100之间这一事实。请注意,如果将
17
除以
10
并将其下限(也称为整数除法),则得到1,再乘以10,得到10,这是最小范围。现在,计算17/10的结果,得到2,乘以10,得到20,这是最大范围。所以你得到了
范围(10,20)
,这是
'A'
-轰

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

解决方案 下面的解决方案使用列表理解+dict生成您需要的内容。但是,如果您有许多值,您可能还需要检查每个值是否正确分类。为此,我建议您使用
dict

代码:示例
#将规则定义为指令
规则={
“A”:[0,9],
"B":[10,19],,
"C":[20,49],,
“D”:[50100],
}
#使用列表理解:一行解决方案

[k表示规则中的k,v.items()如果(min(v)对于这么短的事情,一个
elif
链是一个很好的方法。对于更复杂的情况,你可以使用
bisect
模块做一些事情。有一个简单的解释,有模式吗?如果有模式存在,那么如果这些数字不是基于任何模式,那么你很可能可以避免出现一个
elif
语句线程rns,那么是
elif
是你的选择。这只是一个例子还是实际值?@user2357112supportsMonica,对分是好的!谢谢!需要开始学习所有的标准模块。在这种情况下,我闻到ASCII码的味道。这并不是一个明显的胜利,因为你基本上只是移动了代码,并使用了更多的内存。谢谢这是个好主意,它实际上可以创建一个新字典,而不是一个列表,但我们可以创建一个字典,如{0:“a”,8:“a”,9:“a”,12:“B”…}所以当给定一个int时,我们可以用int调用dict来获取字符串。但是有一个更好的方法。我刚刚用“bisect”模块学习过。这样我们就可以用规则创建一个数组,比如Import bisect;x=[10,20,50101];bisect.bisect(x,12)它将返回1,这意味着它是B。它将12插入索引1。这很好。我还没有使用
bisect
模块。还有另一种选择:
pandas.cut()