0

pnew 到 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()
4

2 回答 2

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))会立即计算)。因此,如果您刚刚从列表中删除了一个用户,则 for 的最后一个值i将尝试访问列表中不再存在的项目。

有一个相关问题会直接作为后续问题发生,那就是您将跳过循环中的元素。您正在从列表中删除一个项目,但您也在前进i,就像没有删除任何项目一样。因此,当您删除 item1时,的item1就是之前的item 2。因此,当您前进到 时2,您将跳过该项目。

那么你能做些什么来解决这个问题呢?嗯,有不同的方法。您可以创建一个 while 循环并以“经典”方式处理该索引(增加自己并始终检查 while 条件中的长度)。您还可以保留第二个列表以记住稍后(循环之后)要删除的项目。但是,在您的情况下,我认为做一些完全不同的事情可能是个好主意。

根据我对您的功能的理解,您想编写一些允许您更改单个用户密码的东西。因此,您输入当前密码,然后输入新密码,它将更新列表中用户的条目。到目前为止,这不是您的版本中正在发生的事情。您的函数的作用如下:

  1. 询问当前密码
  2. 删除所有密码匹配的用户
  3. 如果列表中的最后一个用户没有输入密码,则打印“不正确”(它只会看到 的最后一个d,因此它只会检查最后一个用户)
  4. 要求新密码
  5. 再次遍历用户列表并仅保存最后一个用户(同样,cd包含循环后的最后一个值)
  6. 如果最后一个用户的密码与您输入的相同(为什么要检查,您想输入一个密码),则将相同的用户(因为i再次指向列表中的最后一个索引)附加到列表。

如您所见,发生了一些奇怪的事情,可能不是故意的。你可能想要做的是这样的:

  1. 询问当前密码
  2. 查找该密码的用户
  3. 询问新密码
  4. 从列表中删除旧用户
  5. 将修改后的用户附加到列表

所以也许是这样的:

oldPassword = raw_input('Enter your old password to continue:\n') # 1
found = False
for name, password in Users:
    if password == oldPassword: # 2
        found = True
        break

if found:
    newPassword = raw_input('Enter new password:\n') # 3

    Users.remove((name, password))    # 4
    Users.append((name, newPassword)) # 5
else:
    print 'Incorrect password'
于 2013-03-08T21:15:55.320 回答
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)
于 2013-03-08T21:41:12.417 回答