Python 如何更新元组中列表的一部分?还有索引器:列表索引超出范围我做错了什么?
pnew to python,我正在处理元组中的列表。我只想删除密码而不是用户名,并在密码被删除后更新密码,但是我测试了代码,发现它删除了整个元组和元组中的列表,然后它给了我indexer:list index out-range…任何帮助都将不胜感激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
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)
很好!是的,这正是我想要做的。