import time
password=input("What's your password?")
ans = ""
password=password.lower()
alpha = "abcdefghijklmnopqrstuvwxyz"
n = 0
a=0
starttime=time.time()
while ans !=password:
print(a)
for i in range(len(password)):
letter=alpha[n]
ans+=letter
if ans[a] != password[a]:
print(ans)
ans = ans.replace(ans[a],"")
n+=1
break
else:
a+=1
print(ans)
n=0
break
print("Password Found!")
endtime=time.time()
time=endtime-starttime
print("It took " + str(time) + " seconds!")
这是我的代码,对不起,如果我没有正确发布(第一次在这里)。但是,让我们离题,似乎我得到一个字符串索引超出范围的错误
Traceback (most recent call last):
File "C:\Users\admin\Documents\Letter word cracker.py", line 15, in <module>
if ans[a] != password[a]:
IndexError: string index out of range
我想知道如何解决这个问题,因为它已经在我脑中吃了好几天了。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
好的,我不知道你为什么要这样做,你想要做什么,错误就在这里,因为这一行
ans = ans.replace(ans[a],"") ---> X
替换将做什么,是替换数组中特定字符的所有出现,而您只需要删除最后一个。
例如: -
如果ans =“naa”, 现在替换将替换'a'而基于您的逻辑,您只想删除最后一个元素。因为你已经匹配到“na”,现在正在匹配第三个元素。
你可能会这样做: -
ans = ans[:-1]
但同样,这是一种非常糟糕的方法,因为字符串是不可变的,所以你基本上每次迭代都会创建和销毁字符串。
我给出的一个建议是使用字符列表而不是字符串,它不会显着提升程序的运行时间,无论出于何种原因使用它。
编辑: - for循环也是不必要的,因为它在第一次迭代后总是断开。谢谢@TigerHawk
import time
password=input("What's your password?")
ans = []
password=password.lower()
alpha = "abcdefghijklmnopqrstuvwxyz"
n = 0
a=0
starttime=time.time()
while "".join(ans) !=password:
letter=alpha[n]
ans.append(letter)
if ans[a] != password[a]:
ans.pop()
n+=1
else:
a+=1
n=0
print("Password Found!")
endtime=time.time()
time=endtime-starttime
答案 1 :(得分:0)
这是一个更好,更精简的版本。根据我的理解,你想强制一个字符串将它与密码进行比较。
import time
password=input("What's your password?")
password=password.lower()
alpha = "abcdefghijklmnopqrstuvwxyz"
starttime=time.time()
for letter in range(len(password)):
for index in range(len(alpha)):
if alpha[index] == password[letter]:
print "Letter",letter,"Found."
next
print "Password Found!"
endtime=time.time()
time=endtime-starttime
print "It took",time,"seconds!"
答案 2 :(得分:0)
上一篇文章中存在一些问题,但IndexError正在发生,因为您正在比较每个列表的每个元素,并且当一个列表用完时,它会引发IndexError异常。在if()
中包裹该部分代码,检查是否还有剩余的元素。
这将不修复整个程序,事实上,你可能需要一种更好的方法来进行这种比较...我只是在解释为什么会发生IndexError。
if (ans[a] and password[a]):
if ans[a] != password[a]:
print(ans)
ans = ans.replace(ans[a],"")
n+=1
break
答案 3 :(得分:0)
您应该通过逻辑来理解它为什么不起作用,但您可以对代码进行许多改进。我已经实现了一个工作版本,但下面有一些改进。
from time import time
import string
#this will only work for a-z no whitespace, caps, numbers, etc.
pwd = raw_input("What is your password? ")
pwd = pwd.lower()
#create list of password for easier iterability
password = list(pwd)
#alphabet will have a-z lowercase
alphabet = list(string.ascii_lowercase)
#empty list to start
guess = []
#start timer
start = time()
#outer loop through password
for char in password:
#inner loop through alphabet
for letter in alphabet:
if letter == char:
guess.append(letter)
break
#print correct guess as string
end = time()
print "It took " + str(end - start) + " seconds to solve this password."
#verify correctness
print "".join(guess)
print pwd