如何使用字典作为python中密码的数据库

如何使用字典作为python中密码的数据库,python,python-3.x,q,Python,Python 3.x,Q,现在我想做的是将用户的输入与我已经保存在内存中的字典相匹配。 请帮助我实现这些功能。另外,请建议我实现这些功能的其他方法。如果您得到了名称,我只需要使用以下方法获得pin: print("Please confirm your identity user(lower case):") pins = {"abra":9999,"anna":1888} name = input("") print("Now please confirm you pin:") pin = int(input(">

现在我想做的是将用户的输入与我已经保存在内存中的字典相匹配。
请帮助我实现这些功能。另外,请建议我实现这些功能的其他方法。

如果您得到了名称,我只需要使用以下方法获得pin:

print("Please confirm your identity user(lower case):")
pins = {"abra":9999,"anna":1888}
name = input("")
print("Now please confirm you pin:")
pin = int(input(">>"))
if pin == pins.value[0] and name == pins.keys[0]
    print("You are great")
elif pin == pins.value[1] and name == pins.keys[1]
    print("you are dumb")
如果naem不在PIN中,这将引发异常,因此您可以捕获该异常并使用它告诉用户名称错误

或者,您可以使用safe pins.getname,如果该名称不存在,它将不提供任何信息

>pins={abra:9999,anna:1888} >引脚=输入 1888 >intpin==引脚['anna'] 真的


我会用另一种方法

if pins[name] == int(pin) #input gives you a string
为清楚起见: items将解压缩到给定的关键字key&val中,这样您就可以遍历整个字典

如果您向词典中添加了100个用户,这将有所帮助。这意味着您只需要根据用户的不同更改欢迎消息

如果Anna登录,你可以多做一个侮辱列表,然后从列表中随机选择一个。Google random.choice,因为这与您的原始问题无关

方法的函数/输出:

for key, val in pins.items():
    if name == key:
        if val == pin:
            if name == 'abra':
                print('You are great!')
                break
            if name == 'anna':
                print('You are dumb!')
                break
    else:
        print('Incorrect username or pin, please try again.')
输出:

def test_func_1(db=userpins):
               start_time = time.time()
               name = 'testname14'
               pin = 1248
               if db[name] == pin:
                   print('authenticated!')
               print("--- %s seconds ---" % (time.time() - start_time))
def test_func_2(db=userpins):
               start_time = time.time()
               db = db.items()
               name = 'testname14'
               pin = 1248
               for user, pin_c in db:
                   if user == name:
                       if pin_c == pin:
                           print('authenticated')
               print("--- %s seconds ---" % (time.time() - start_time))
以及my函数的函数/输出:

test_func_1()

authenticated!
--- 0.048806190490722656 seconds ---
输出:

def test_func_1(db=userpins):
               start_time = time.time()
               name = 'testname14'
               pin = 1248
               if db[name] == pin:
                   print('authenticated!')
               print("--- %s seconds ---" % (time.time() - start_time))
def test_func_2(db=userpins):
               start_time = time.time()
               db = db.items()
               name = 'testname14'
               pin = 1248
               for user, pin_c in db:
                   if user == name:
                       if pin_c == pin:
                           print('authenticated')
               print("--- %s seconds ---" % (time.time() - start_time))
不确定你的评论是否真的有效,因为很明显,功能似乎更快

我不得不稍微调整一下。因此,我们不是在for循环期间解包,而是在开始循环之前解包。然后我们迭代一个名称列表,只匹配名称,如果名称匹配,我们就可以检查pin

希望你决定改变你的投票,考虑到我花时间告诉你为什么你是不正确的

我还冒昧地做了50倍长的别针字典。如果您想测试它们,我将在此处向您提供该列表:

test_func_2()

authenticated
--- 0.048050880432128906 seconds ---

学习使用python dict怎么样?很抱歉,我没有意识到我可能理解错误,但我认为这是一种低效的处理方法,因为你重复整个dict,将每个键与给定的名称进行比较。这破坏了dicts通常提供的快速查找时间。我认为您误解了循环,请注意break这意味着break for循环。这也意味着,如果有一个正匹配的pin和用户名,循环将停止.Ofc,但对于某些值,您迭代整个过程,平均而言,每次查找用户时,您将迭代dict的一半,这使得在其中查找值基本上是类似于列表。虽然直接通过键检查值更像是O1,通过哈希表优化dict,从而独立于dict长度。我必须不同意并拒绝投票。在你的问题中,你问还有什么其他方法可以使用?我的答案是一个非常合理和简单的答案,这本可以帮助你和其他寻求类似答案的人。让我失望的是,这种愚蠢的无理由向下投票的文化在SON上继续肆无忌惮地存在着。另外,请注意:我已经用两个不同的用户名和PIN测试了这些函数。在上面的示例中,testname14与引脚1248一起使用。我也在我的个人电脑testuser99上进行了测试,pin为1333。在这两种情况下,使用test_func_2和test_func_1进行检查所需的时间都较短。