如何在元组中更新列表的一部分?还有IndexError:列表索引超出范围我做错了什么?

时间:2013-03-08 20:36:43

标签: python python-2.7

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()

2 个答案:

答案 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条件下的长度)。您还可以保留第二个列表以记住稍后要删除的项目(循环后)。但是在你的情况下,我认为做一些完全不同的事情可能是一个好主意。

根据我对您的功能的理解,您希望编写允许您更改单个用户密码的内容。因此,您输入当前密码,然后输入新密码,它将更新列表中用户的条目。这不是您现在版本中发生的情况。您的功能如下:

  1. 询问当前密码
  2. 删除所有具有匹配密码的用户
  3. 如果列表中的最后一个用户没有输入密码,则打印“不正确”(它只会看到d最后值,因此它只会检查最后一个用户)
  4. 要求新密码
  5. 再次循环浏览用户列表并仅保存最后一个用户(同样,cd将包含循环后的最后一个值)
  6. 如果最后一个用户使用的密码与您输入的密码相同(为什么要检查该密码,则需要输入密码),然后追加相同的用户(因为{{ 1}}再次指向列表中的最后一个索引)到列表。
  7. 正如你所看到的,有一些奇怪的事情正在发生,可能并非有意。您可能想要做的事情是这样的:

    1. 询问当前密码
    2. 找到该密码的用户
    3. 要求输入新密码
    4. 从列表中删除旧用户
    5. 将修改后的用户附加到列表
    6. 所以也许是这样的:

      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)