字符串索引超出范围(Python)我也做了限制

时间:2015-06-12 20:29:34

标签: python

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

我想知道如何解决这个问题,因为它已经在我脑中吃了好几天了。任何帮助将不胜感激,谢谢!

4 个答案:

答案 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