python-如何检查python字典中是否存在值?

时间:2020-04-13 05:52:30

标签: python

假设我的字典字典叫做record,其中第一个,第二个是键

 records = {
                 first: {
                    "email": email,
                    "password": password,
                    "pwd_secret" : None
                     }

                 second: {
                    "email": email,
                    "password": password,
                    "pwd_secret" : code
                     }
           }

然后,我检查代码是否等于所有命令中的“ pwd_secret”值。该功能的代码可以正常运行,但是我的else语句不起作用(如果代码在任何命令中都不是“ pwd_secret”的值,那么我想引发一个错误。但是目前它仅引发一个错误即使代码存在。)有什么建议吗?

 for k, v in records.items():
                pwd_secret = v.get('pwd_secret')
                if pwd_secret == code:
                    hashed_password = hash_password(new_password)
                    v['password'] = hashed_password
                #else:
                    #raise ValueError("code is invalid")

3 个答案:

答案 0 :(得分:2)

您可以通过values并使用if条件:

for v in records.values():
    pwd_secret = v.get('pwd_secret')
    if pwd_secret == code:
        # found

您真的不需要通过items,因为看起来您不需要密钥。

对于您的错误,由于ValueError不等于else,因此从pwd_secret分支中引发了code。如果您不希望这样,则应在编辑器内设置一个断点,并逐步浏览代码以查看实际情况。

另一个更简单的调试步骤是仅print找出以下每个值:

for v in records.values():
    pwd_secret = v.get('pwd_secret')

    print(f"pwd secret: {pwd_secret} and code: {code}") # print values here

    if pwd_secret == code:
        print("Secret is valid!")
    else:
        raise ValueError("code is invalid")

如果在内部词典中找不到v.get('pwd_secret'),可能还会指出None为您提供了默认值'pwd_secret'

另外,如果要检查内部字典中的任何是否具有代码,则可以使用内置函数any()

if any(v.get('pwd_secret') == code for v in records.values()):
    print("Secret found!")
else:
    raise ValueError("Secret not found")

答案 1 :(得分:1)

假设这本字典:

records = {
  'first': {
                "email": 1234,
                "password": 1234,
                "pwd_secret" : None
                 },
             'second': {
                "email": 1234,
                "password": 1234,
                "pwd_secret" : 'code'
                 }
       }

和测试循环:

for v in records.values():
  if v['pwd_secret'] == 'code':
    print('here...')

代替print()子句,只需输入您希望执行的必要动作即可。 换句话说-您的代码应该可以工作,问题可能不在于在嵌套字典中查找值。

答案 2 :(得分:1)

功能:

def check_value(dict_of_dicts, value):
    return any(value in dict_.values() for dict_ in dict_of_dicts.values()) 

示例:

a = {
      'first': {
         "email": 'email',
         "password": 'password',
         "pwd_secret": None
      },

      'second': {
         "email": 'email',
         "password": 'password',
         "pwd_secret": 'code'
      }
}

check_value(a, 'code')
# True