如何选择此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:]))
(答案将是正确的或错误的)。它不会更快,但更清楚的是,IMHOktzr的答案需要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的速度。仍然不够。。。我想知道这是否是进行比较的最简单方法,但我想不出其他方法。仍然不够。。。我想知道这是否是进行比较的最简单方法,但我想不出其他方法。伟大的解决方案,我希望我想到了。伟大的解决方案,我希望我想到了。