Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x &引用;模糊的;用Python中的哈希表替换elif链?_Python 3.x_Hashmap_Simplify - Fatal编程技术网

Python 3.x &引用;模糊的;用Python中的哈希表替换elif链?

Python 3.x &引用;模糊的;用Python中的哈希表替换elif链?,python-3.x,hashmap,simplify,Python 3.x,Hashmap,Simplify,从依赖于变量的许多执行路径或数据位中选择一个的Python方法是使用哈希表,如下所示: mapping = {'bar':"xyzzy", 'foo':"plugh", 'baz':"frobnitz"} magic = mapping[command] 如果我想根据某个值是否在多个值的范围内来选择执行路径,该怎么办 或者,更简洁地说,我该如何将其pythonice化: #A value from one to four indicates an O-type star. 4/58 c

从依赖于变量的许多执行路径或数据位中选择一个的Python方法是使用哈希表,如下所示:

mapping = {'bar':"xyzzy", 'foo':"plugh", 'baz':"frobnitz"}
magic = mapping[command]
如果我想根据某个值是否在多个值的范围内来选择执行路径,该怎么办

或者,更简洁地说,我该如何将其pythonice化:

    #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到4的值表示O型星形。4/58机会。

如果typeselec将您的
specttype
s存储在加权列表中,并使用
typeselec
作为索引进行查找。生成列表后,查找为O(1)

您可以使用字典而不是单独的iterables
字母
频率
,但是生成的
specttypes
将按字母顺序排列,除非您使用了


请注意,
specttypes
有57个以上定义的元素,而不是您提到的58个。那是因为你最后的代码注释自相矛盾;我给“M”分配了8而不是9的频率(即索引50-57而不是50-58)。

将您的
specttype
s存储在加权列表中,并使用
typeselec
作为索引进行查找。生成列表后,查找为O(1)

您可以使用字典而不是单独的iterables
字母
频率
,但是生成的
specttypes
将按字母顺序排列,除非您使用了


请注意,
specttypes
有57个以上定义的元素,而不是您提到的58个。那是因为你最后的代码注释自相矛盾;我给‘M’分配了8而不是9的频率(即索引50-57而不是50-58)。

如果我们有一个大范围,我会将数字按排序顺序存储,并用于进行二进制搜索;用于查找的是O(log(n)),而不是O(n)。仍然不是完美散列的O(1)。当然,对于您展示的非常有限的集合,您最好将值存储在单个字符串中,并将其用作普通的查找表。chikinn的例子做到了这一点,但是使用了一个列表(想想看,它会更有效——不需要查找字符串版本的字符)

如果我们有一大组范围,我会将数字按排序顺序存储,并用于进行二进制搜索;用于查找的是O(log(n)),而不是O(n)。仍然不是完美散列的O(1)。当然,对于您展示的非常有限的集合,您最好将值存储在单个字符串中,并将其用作普通的查找表。chikinn的例子做到了这一点,但是使用了一个列表(想想看,它会更有效——不需要查找字符串版本的字符)

正是这种类型或问题被用作模块的示例

根据您的问题进行调整,它将如下所示:

from bisect import bisect_left

def select_type(typeselec,
                breakpoints=[4, 20, 30, 36, 40, 50],
                types='0BAFGKM'):
    return types[bisect_left(breakpoints, typeselec)]


for i in range(59):
    print(i, select_type(i))

与文档中的示例不同的是,这里的断点是下限的一部分(
正是这种类型或问题被用作模块的示例

根据您的问题进行调整,它将如下所示:

from bisect import bisect_left

def select_type(typeselec,
                breakpoints=[4, 20, 30, 36, 40, 50],
                types='0BAFGKM'):
    return types[bisect_left(breakpoints, typeselec)]


for i in range(59):
    print(i, select_type(i))

与文档示例不同的是,这里的断点是下限的一部分(
你可以用
\uu getitem\uuuuu
中你想要的逻辑构建你自己的
FuzzyMap
,我可以,这看起来很不错,但最终它仍然是一个elif链,而不是一个隐藏的elif链。我想知道我是否可以保留Python非模糊映射的O(1)性能。
O(1)
源于散列的使用,所以唯一的另一个选择是自定义键对象,其中每个范围中的所有值都散列为相同的值。是的,我也这么认为,我怀疑这是可能的。但我以前错了。你能详细说明一下为什么在散列中缓存计算值不合适吗?顺便说一下,我如果你的值是连续的,你可以考虑使用一个列表,考虑到你可以建立自己的<代码> FuffyMAP,你想在<代码>中的逻辑,我可以,而且看起来不错,但是最后它还是一个ELIF链,Albe是一个隐藏的ELIF链。我想知道我是否能保存O(1)。Python非模糊映射的性能
O(1)
源于散列的使用,所以唯一的另一个选择是自定义键对象,其中每个范围中的所有值都散列为相同的值。是的,我也这么认为,我怀疑这是可能的。但我以前错了。你能详细说明一下为什么在散列中缓存计算值不合适吗?顺便说一下,我如果你的价值是连续的,你可以考虑使用一个列表,考虑到这样的效率,但是我必须和<代码>平分更大的优雅的答案。我喜欢这个效率,但是我必须要用<代码>平分< /代码>以获得更高雅的回答。