【发布时间】:2014-05-25 16:58:02
【问题描述】:
选择依赖于变量的许多执行路径或数据位之一的 Pythonic 方法是使用哈希表,如下所示:
mapping = {'bar':"xyzzy", 'foo':"plugh", 'baz':"frobnitz"}
magic = mapping[command]
如果我想根据一个值是否在多个值范围之一内来选择执行路径,我该怎么办?
或者,更简洁地说,我如何将其 Python 化:
#A value from one to four indicates an O-type star. 4/58 chance.
if typeselec <= 4:
self.specttype="O"
#A value from 5-20 indicates a B-type star. 15/58 chance.
elif typeselec <= 20:
self.specttype="B"
#A value from 20-30 indicates an A-type star. 10/58 chance.
elif typeselec <= 30:
self.specttype="A"
#A value from 31-36 indicates an F-type star. 6/58 chance.
elif typeselec <= 36:
self.specttype="F"
#A value from 37-40 indicates a G-type star. 4/58 chance.
elif typeselec <= 40:
self.specttype="G"
#A value from 41-50 indicates a K-type star. 10/58 chance.
elif typeselec <= 22:
self.specttype="K"
#A value from 50-58 indicates an M-type star. 8/58 chance.
else:
self.specttype="M"
一个明显的方法是{1:'O', 2:'O',3:'O',4:'O',5:'B',6:'B'...},但这似乎非常不优雅和低效。有没有其他办法?
【问题讨论】:
-
您可以在
__getitem__中使用您想要的逻辑构建您自己的FuzzyMap -
我可以,那会看起来不错,但最终它仍然是一个 elif 链,虽然是一个隐藏的 elif 链。我想知道是否可以保留 Python 的非模糊映射的 O(1) 性能。
-
O(1)来自哈希的使用,因此唯一的其他选择是自定义键对象,其中每个范围内的所有值都哈希到相同的值。 -
是的,我也是这么认为的,但我怀疑这是可能的。但我以前错了。
-
您能否详细说明为什么您认为将计算值缓存在散列中并不优雅?顺便说一句,如果您的值是连续的,您可以考虑使用列表
标签: python-3.x hashmap simplify