pnew to python,我正在玩元组中的列表。我想删除密码而不是用户名,并在删除密码后更新密码,但是我测试了代码,发现它删除了元组中的整个元组和列表,然后它给了我IndexError:list index超出范围....任何帮助将不胜感激。
Users=[("Jim","password1"),("Bob","password2"),("Helen","password3"),("Beverly","blue")]
def changePassword():
a=raw_input("Enter old password to continue:\n")
for i in range(len(Users)):
c,d=Users[i]
if a==d:
Users.remove(Users[i])
print "Password deleted"
print Users
if a!=d:
print"Incorrect"
changePassword()
a=raw_input("Enter new password:\n")
for i in range(len(Users)):
c,d=Users[i]
if a==d:
Users.append(Users[i])
changePassword()
答案 0 :(得分:0)
你的功能有几个问题,除非我完全误解了它的目的,但让我们从你得到的IndexError
开始。
这是它发生的代码:
for i in range(len(Users)):
c,d=Users[i]
if a==d:
Users.remove(Users[i])
print "Password deleted"
print Users
那么这里发生了什么?循环遍历列表的长度,如果匹配密码,则从列表中删除当前用户。之后,您继续迭代先前计算的列表长度。因此,如果从列表中删除一个项目,其长度减少一个,但是 for循环仍将迭代旧的长度(因为range(len(Users))
会立即被评估)。因此,如果您刚刚从列表中删除了一个用户,则i
的最后一个值将尝试访问列表中不再存在的项目。
有一个相关的问题会直接作为后续问题发生,那就是你会跳过循环中的元素。您正在从列表中删除某个项目,但您也正在推进i
,就像没有删除任何项目一样。因此,当您移除项目1
时,新项1
就是之前2
的项目。因此,当您前进到2
时,您将跳过该项目。
那么你能做些什么来解决这个问题呢?嗯,有不同的方法。您可以改为使用while循环并以“经典”方式处理索引(增加自己并始终检查while条件下的长度)。您还可以保留第二个列表以记住稍后要删除的项目(循环后)。但是在你的情况下,我认为做一些完全不同的事情可能是一个好主意。
根据我对您的功能的理解,您希望编写允许您更改单个用户密码的内容。因此,您输入当前密码,然后输入新密码,它将更新列表中用户的条目。这不是您现在版本中发生的情况。您的功能如下:
d
的最后值,因此它只会检查最后一个用户)c
和d
将包含循环后的最后一个值)正如你所看到的,有一些奇怪的事情正在发生,可能并非有意。您可能想要做的事情是这样的:
所以也许是这样的:
i
答案 1 :(得分:0)
我不确定元组列表是存储用户ID和密码的最佳方式。 也许你可以使用字典,看起来像这样:
Passwords = {"Jim": "password1", "Bob": "password2", "Helen":"password3", "Beverly": "blue"}
这样您就可以确定两个不同的用户不会拥有相同的ID。
此外,通过密码检索用户不是一个好主意,因为几个用户可能具有相同的密码 密码。您应首先提示输入用户ID,或将其作为更改密码功能的参数传递。像这样:
def changePassword(userId):
input=raw_input("Enter old password to continue:\n")
if input == Passwords[userId]:
new_password = raw_input("Enter new password:\n")
Passwords[userId] = new_password
else:
print "Wrong password"
changePassword(userId)