Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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 是否有一种方法可以键入提示,提示可以以二进制方式搜索元组?_Python_Python 3.x_Python Typing - Fatal编程技术网

Python 是否有一种方法可以键入提示,提示可以以二进制方式搜索元组?

Python 是否有一种方法可以键入提示,提示可以以二进制方式搜索元组?,python,python-3.x,python-typing,Python,Python 3.x,Python Typing,您能告诉Python字符串列表是经过排序的,并且可以以二进制方式进行搜索吗 假设您有一个字符串元组,如下所示: 从键入导入元组 单词:元组[str]=(“字母表”、“自行车”、“汽车”、“房子”、“单词”) 首先,我的打字暗示正确吗? 其次,有没有一种方法可以告诉python这个元组可以以二进制方式搜索(因为它是排序的)或者它是不必要的?类型注释应该是tuple[t1,t2,…]其中t1,t2…是对应元组值的类型。您键入的方式暗示了元组,这意味着它是一个包含单个字符串项的元组 创建类型提示系统

您能告诉Python字符串列表是经过排序的,并且可以以二进制方式进行搜索吗

假设您有一个字符串元组,如下所示:

从键入导入元组
单词:元组[str]=(“字母表”、“自行车”、“汽车”、“房子”、“单词”)
首先,我的打字暗示正确吗?
其次,有没有一种方法可以告诉python这个元组可以以二进制方式搜索(因为它是排序的)或者它是不必要的?

类型注释应该是
tuple[t1,t2,…]
其中
t1,t2…
是对应元组值的类型。您键入的方式暗示了元组,这意味着它是一个包含单个字符串项的元组

创建类型提示系统是为了将类似静态的声明引入python,因此需要注意两件事

  • 如果有2-3个项目的元组(例如,
    Tuple[number,number]
    表示2D点),则注释元组是有意义的。您拥有的是一个集合,最好注释为
    Iterable[str]
  • 无法表示集合已排序,因为类型注释只注释类型,这与集合是否已排序无关

不能说元组可以使用类型提示进行二进制搜索。但是,您可以编写一个decorator来包装函数,以强制所有输入元组都进行排序。如果有许多函数需要排序元组作为输入,那么这可能是一个好主意。它不修改元组(它不能——元组是不可变的)


def已排序(t):
“”“如果元组t已排序,则返回true”“”
返回已排序(列表(t))==列表(t)
def强制排序(func):
def内部(*args,**kwargs):
new_args=[None]*len(args)#由于args是一个元组,因此无法修改它
对于n,枚举中的arg(args):
新参数[n]=arg
如果isinstance(参数,元组):
##你想把它分类吗?
new_args[n]=元组(已排序(arg))
##或者,如果未排序,是否等待引发异常?
#如果未排序(arg):
#raise VALUERROR(“必须对输入元组进行排序”)
对于k,v在kwargs.items()中:
如果isinstance(v,元组):
##你想把它分类吗?
kwargs[k]=元组(已排序(v))
##或者,如果未排序,是否要引发异常?
#如果未排序(v):
#raise VALUERROR(“必须对输入元组进行排序”)
返回函数(*新参数,**kwargs)
返回内部
@强制排序
def显示两个示例(t1、t2):
“”“打印两个元组,t1和t2”“”
打印(f“t1:{t1}”)
打印(f“t2:{t2}”)
a=(1,2,3,4,5)#排序
b=(9,8,6,4,2)#未排序
c=[1,2,6,2,3]#未排序,但不是元组,因此不会受到影响
打印(f“\n原始:t1={a},t2={b}”)
显示两个示例(a、b)
打印(f“\n原始:t1={b},t2={a}”)
显示两个示例(b,a)
打印(f“\n原始:t1={a}t2={c}”)
显示两个示例(a,c)
打印(f“\n原始:t1={c},t2={b}”)
显示两个示例(t1=c,t2=b)
输出:

Original: t1 = (1, 2, 3, 4, 5), t2 = (9, 8, 6, 4, 2)
t1: (1, 2, 3, 4, 5)
t2: (2, 4, 6, 8, 9)

Original: t1 = (9, 8, 6, 4, 2), t2 = (1, 2, 3, 4, 5)
t1: (2, 4, 6, 8, 9)
t2: (1, 2, 3, 4, 5)

Original: t1 = (1, 2, 3, 4, 5) t2 = [1, 2, 6, 2, 3]
t1: (1, 2, 3, 4, 5)
t2: [1, 2, 6, 2, 3]

Original: t1 = [1, 2, 6, 2, 3], t2 = (9, 8, 6, 4, 2)
t1: [1, 2, 6, 2, 3]
t2: (2, 4, 6, 8, 9)

根据需要,您可以在decorator中自动对元组进行排序(这就是它现在正在做的),或者如果元组未排序,您可以引发异常(通过切换注释掉的部分)。

tuple[str]
将是字符串的1元组,根据您的需要
tuple[str,…]
。分类是一个价值问题,而不是类型问题,我认为这是不受支持的。