Python:“索引器:列表索引超出范围”密码生成器

2024-09-24 16:32:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用secrets模块在python中创建一个密码生成器。 我首先询问用户所需的密码长度,然后在3个字符列表(字母、数字、符号)中随机选择。然后我通过循环一个接一个地打印结果

我的问题是,在用户询问大约12个字符之前,该程序工作正常。然后我得到以下错误IndexError: list index out of range,在搜索了几个小时后,我无法找到答案

抱歉,如果这个问题看起来很基本,但我还是个初学者,只想提高

这是我的密码:

import secrets
# importing modules

doRun = True
while doRun:
    length = int(input("How many characters do you want you password to have ? "))
    # Asking the user for the length of the password

    letCar = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
              "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
              "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    # List for characters
    numCar = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
    # List for numbers
    symCar = ["!", "@", "?"]
    # List for symbols
    password = []
    # Initializing list for password

    for i in range(0, length):
        selector = secrets.randbelow(3)
        # Randomly choosing from which list to pick
        if selector == 0:
            # Characters list
            chosenCar = secrets.choice(letCar)
            password.append(chosenCar)
            letCar.remove(chosenCar)
        elif selector == 1:
            # Numbers list
            chosenCar = secrets.choice(numCar)
            password.append(chosenCar)
            numCar.remove(chosenCar)
        elif selector == 2:
            # Symbols list
            chosenCar = secrets.choice(symCar)
            password.append(chosenCar)
            symCar.remove(chosenCar)

    print("password is : ", end="")
    for i in range(len(password)):
        print(password[i], end="")
    print()
    doRun = input("Again ? (Yes --> True // No --> False) : ")

错误是:

Traceback (most recent call last):
  File "E:\Bureautique\Outils\Programmation\Python\Projects\PWHash\main.py", line 35, in <module>
    chosenCar = secrets.choice(symCar)
  File "C:\Users\Arthur\AppData\Local\Programs\Python\Python39\lib\random.py", line 347, in choice
    return seq[self._randbelow(len(seq))]
IndexError: list index out of range

谢谢你的帮助


Tags: ofthein密码forrangepasswordselector
3条回答

我认为这是因为您正在从汽车列表中删除项目,因此当一辆汽车被选择足够多次时,在symCars的情况下,您的程序崩溃的行只有3次,然后它是一个空列表,因此如果再次选择汽车,则列表中没有任何内容可供机密模块查找

我不知道这是否是你想要的,但这就是我的工作方式

for i in range(0, length):
        selector = secrets.randbelow(3)
        # Randomly choosing from which list to pick
        if selector == 0:
            # Characters list
            chosenCar = secrets.choice(letCar[i])
            password.append(chosenCar)
            letCar.remove(chosenCar)
        elif selector == 1:
            # Numbers list
            chosenCar = secrets.choice(numCar[i])
            password.append(chosenCar)
            numCar.remove(chosenCar)

问题是每次从symCar中选择一个项目时,都会删除该项目。这会在重复三次后清空列表。要解决此问题,可以删除。删除行。虽然这允许在密码中包含多个单个字符,但这有助于保持密码的不可预测性

另一个选择是添加一种方式,让列表在其所有项目被删除后重新填充。下面是一个例子

if symCar == []:
    symCar = ["!", "@", "?"]

相关问题 更多 >