0

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

それで、ここで何が起こりますか?リストの長さをループし、パスワードが一致した場合は、現在のユーザーをリストから削除します。その後、以前に計算されたリストの長さを繰り返します。そのため、リストから項目を 1 つ削除すると、その長さは 1 つ減ります、for ループは古い長さで繰り返します (range(len(Users))がすぐに評価されるため)。そのため、リストから 1 人のユーザーを削除しただけの場合、 の最後の値はi、リストに存在しなくなったアイテムにアクセスしようとします。

フォローアップとして直接発生する関連する問題があります。それは、ループ内の要素をスキップすることです。リストからアイテムを削除していますがi、アイテムが削除されていない場合と同じように進んでいます。したがって、たとえば item を削除すると、1新しいアイテム1以前のアイテムになり2ます。に進むと2、その項目はスキップされます。

では、これを修正するにはどうすればよいでしょうか。さて、さまざまな方法があります。代わりに while ループを作成し、そのインデックス付けを「従来の」方法で処理することができます (自分自身をインクリメントし、while 条件で常に長さをチェックします)。後で (ループ後に) 削除するアイテムを覚えておくために、2 つ目のリストを保持することもできます。しかし、あなたの場合、まったく違うことをするのは良い考えかもしれないと思います。

私があなたの機能をどのように理解したかから、単一のユーザーのパスワードを変更できるようにする何かを書きたいと思っています。したがって、現在のパスワードを入力してから新しいパスワードを入力すると、リスト内のユーザーのエントリが更新されます。これは、現時点であなたのバージョンで起こっていることではありません。あなたの機能は次のとおりです。

  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"}

このようにして、2 人の異なるユーザーが同じ 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 に答える