Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更新元组中列表的一部分?还有索引器:列表索引超出范围我做错了什么?_Python_Python 2.7 - Fatal编程技术网

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

Python 如何更新元组中列表的一部分?还有索引器:列表索引超出范围我做错了什么?,python,python-2.7,Python,Python 2.7,pnew to python,我正在处理元组中的列表。我只想删除密码而不是用户名,并在密码被删除后更新密码,但是我测试了代码,发现它删除了整个元组和元组中的列表,然后它给了我indexer:list index out-range…任何帮助都将不胜感激 Users=[("Jim","password1"),("Bob","password2"),("Helen","password3"),("Beverly","blue")] def changePassword(): a=raw_i

pnew to python,我正在处理元组中的列表。我只想删除密码而不是用户名,并在密码被删除后更新密码,但是我测试了代码,发现它删除了整个元组和元组中的列表,然后它给了我indexer:list index out-range…任何帮助都将不胜感激

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

你的函数有几个问题,除非我完全误解了它的用途,但是让我们从你得到的
索引器开始

这是发生这种情况的代码:

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
    再次指向列表中的最后一个索引)附加到列表中
  • 正如你所看到的,有一些奇怪的事情正在发生,可能不是有意的。您可能想做的是这样的事情:

    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'
    
    Passwords = {"Jim": "password1", "Bob": "password2", "Helen":"password3", "Beverly": "blue"}
    
  • 询问当前密码
  • 查找该密码的用户
  • 询问新密码
  • 从列表中删除旧用户
  • 将修改后的用户追加到列表中
  • 所以可能是这样的:

    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'
    
    Passwords = {"Jim": "password1", "Bob": "password2", "Helen":"password3", "Beverly": "blue"}
    

    我不确定元组列表是否是存储用户ID和密码的最佳方式。 也许你可以用字典来代替,它看起来是这样的:

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

    很好!是的,这正是我想要做的。