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()