Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 - Fatal编程技术网

如何选择此Python代码?

如何选择此Python代码?,python,Python,我正在制作一个代码,接收电话号码列表,然后检查其中一个或多个号码是否是列表中其他号码的前缀。我想优化到最大,这样它可以运行得尽可能快。代码如下: cases = [] t = int(input()) for i in range(0, t): n = int(input()) case = [] for j in range(0, n): case.append(str(input())) cases.append(sorted(case))

我正在制作一个代码,接收电话号码列表,然后检查其中一个或多个号码是否是列表中其他号码的前缀。我想优化到最大,这样它可以运行得尽可能快。代码如下:

cases = []

t = int(input())

for i in range(0, t):
    n = int(input())
    case = []
    for j in range(0, n):
        case.append(str(input()))
    cases.append(sorted(case))

print(cases)

for c in cases:
    answer = 'YES'
    for k in range(0, len(c)):
        if answer == 'YES':
            for l in range(0, len(c)):
                if c[k] != c[l]:            
                    if c[k] == c[l][0:len(c[k])]:
                        answer = 'NO'
                        break
        else:
            break
    print(answer) 
编辑:使用@Gelineau提出的答案,代码运行时间为0.82秒,即从>3秒到达解决方案之前的时间。现在,解决方案如下所示:

cases = []

t = int(input())

for i in range(0, t):
    n = int(input())
    case = []
    for j in range(0, n):
        case.append(str(input()))
    cases.append(case)

for case in cases:
    answer = 'YES'
    case.sort()    
    for case_k, case_next in zip(case, case[1:]):
        if case_k == case_next[:len(case_k)]:
            answer = 'NO'
            break
    print(answer)

如果您希望它非常快,那么python可能不是正确的选择。但是你可以做一些小的改变,比如代替

for i in range(len(c): 
    use c[i] ...
你可以用

for i in range(len(c): 
    use i ...
另外,
answer==“YES”
将始终为真,因为当您将其设为假时,您会刹车。我最终将您的代码缩减为:

for case in cases:
    answer = 'YES'
    for case_k, case_l in product(case,case):
        if case_k != case_l and case_k == case_l[:len(case_k)]:
            answer = 'NO'
            break
    print(answer)
您无法真正加快IO速度,您可以将其更改为列表生成,但您并不能真正获得任何东西,可读性也会受到很大影响:

cases = [sorted([str(input()) for _ in range(int(input()))]) for _ in range(int(input()))]
编辑:根据@Gelineau留下的评论,我想我应该再试一次

但它仍然在O(n^2)时间内生长


如果您希望它非常快,那么python可能不是正确的选择。但是你可以做一些小的改变,比如代替

for i in range(len(c): 
    use c[i] ...
你可以用

for i in range(len(c): 
    use i ...
另外,
answer==“YES”
将始终为真,因为当您将其设为假时,您会刹车。我最终将您的代码缩减为:

for case in cases:
    answer = 'YES'
    for case_k, case_l in product(case,case):
        if case_k != case_l and case_k == case_l[:len(case_k)]:
            answer = 'NO'
            break
    print(answer)
您无法真正加快IO速度,您可以将其更改为列表生成,但您并不能真正获得任何东西,可读性也会受到很大影响:

cases = [sorted([str(input()) for _ in range(int(input()))]) for _ in range(int(input()))]
编辑:根据@Gelineau留下的评论,我想我应该再试一次

但它仍然在O(n^2)时间内生长


在我看来,由于列表已排序,您可以直接用一个循环比较相邻的记录

['2345','1234','123','4567','12345','21234'] => ['123', '1234', '12345', '21234', '2345', '4567']
如果上一条记录长度小于当前记录长度,且当前前X个数字等于上一条记录长度。然后找到并打破


感谢您,由于列表已排序,您可以使用一个循环直接比较相邻记录

['2345','1234','123','4567','12345','21234'] => ['123', '1234', '12345', '21234', '2345', '4567']
如果上一条记录长度小于当前记录长度,且当前前X个数字等于上一条记录长度。然后找到并打破


谢谢

ktzr的答案需要n*n比较,n=len(大小写)。 您可以先对案例进行排序(n*log(n)操作),然后只需将一个案例与列表中的下一个案例(n个操作)进行比较

编辑:

也可以使用生成器表达式:

case.sort()
answer = all(case_k != case_next[:len(case_k)] for case_k, case_next in zip(case, case[1:]))

(答案将是正确的或错误的)。它不会更快,但更清楚的是,IMHO

ktzr的答案需要n*n比较,n=len(case)。 您可以先对案例进行排序(n*log(n)操作),然后只需将一个案例与列表中的下一个案例(n个操作)进行比较

编辑:

也可以使用生成器表达式:

case.sort()
answer = all(case_k != case_next[:len(case_k)] for case_k, case_next in zip(case, case[1:]))

(答案将是正确的或错误的)。它不会更快,但更清楚的是,IMHO

resposta
未定义。感谢您通知man,我只是在解析到编辑器时忘了重命名它。请用C重写它。或者用Cython或Pypy运行它-通过这些,可以用常规Python代码获得类似C的速度。
resposta
未定义。感谢您通知man,我只是忘记了在解析到编辑器时重命名它。用C重写它。或者用Cython或Pypy运行它-用这些工具可以用常规Python代码获得类似C的速度。仍然不够。。。我想知道这是否是进行比较的最简单方法,但我想不出其他方法。仍然不够。。。我想知道这是否是进行比较的最简单方法,但我想不出其他方法。伟大的解决方案,我希望我想到了。伟大的解决方案,我希望我想到了。