【问题标题】:How to get value from dict if its key can have several values如果 dict 的键可以有多个值,如何从 dict 中获取值
【发布时间】:2021-03-03 16:10:12
【问题描述】:

我有一个具有如下凭据的字典:

secret = {"password": "jdksal",
          "user": "fjdklas",
          "schema": "jfdaskl"}

我想为密码、用户和架构创建一个变量。但是,secret dict 可以为每个键设置其他值,这样我就有了命名元素的可能方法列表,如下所示:

pass_words = ['password', 'pass', 'contraseña']

因此,当字典中存在列表pass_words 的任何键时,将创建变量密码。字典中只有一个来自 pass_words 的单词。与用户、架构等相同。到目前为止,我有这个代码:

for word in pass_words:
    if word in secret:
        password = secret[word]

user_words = ['user', 'username', 'login', 'name']
for word in user_words:
     if word in secret:
         user = secret[word]

它有效,但它非常冗长。有没有更简洁的方法来做到这一点?谢谢

【问题讨论】:

  • pass_words 中只有一个字在secret 中,还是可能不止一个?
  • 。就一个字。
  • 如果你必须多次这样做,我建议创建一个类来实现这个功能或一个快速查找的函数。我以前通过实现一个函数来做到这一点,它对我来说效果很好。我强烈建议的唯一一件事是将您的“可能的单词”存储在一个集合而不是一个列表中,因为查找时间将是 O(1)。

标签: python python-3.x list dictionary


【解决方案1】:

正如您所写,如果pass_wordsecret 之间有多个重叠,password 将获得最后一个匹配项。我不知道这是你的意图。

如果只有一个重叠,您可以使用集合操作:

>>> secret.keys() & pass_words
{'password'}
>>> secret.keys() & user_words
{'user'}

然后获取与该键关联的值:

>>> secret[(secret.keys() & pass_words).pop()]
jdksal
>>> secret[(secret.keys() & user_words).pop()]
fjdklas

对于没有 dict set 视图的旧版 Python,只需将 set 应用于每个 Python 以获得相同的结果:

>>> set(secret.keys()) & set(user_words)
{'user'}

使用 Python 3.6+,您可以:

password, user={k:v for k,v in secret.items() if k in pass_words+user_words}.values()

【讨论】:

  • 谢谢!不过,这只是问题的一半。一旦我知道“密码”和“用户”是现有键,我需要从字典中获取值。有没有比 secret[list(secret.keys() & pass_words)[0]] 更好的方法?
  • @JavierLópezTomás: secret[(secret.keys() & pass_words).pop()]
【解决方案2】:

我认为这会更好:

pass_words = ['password', 'pass', 'contraseña']

secret = {"password": pass_words,
          "user": "fjdklas",
          "schema": "jfdaskl"}

input_password = input("Enter Your Password: ")
for key,value in secret.items():
    if input_password in value:
        print("Correct Password")

您可以随意更改输入法。 Key 变量将保存字典中第一项的键,Value 变量将保存第一项的值,在您的情况下,这将是一个列表在字典里。

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多