假设我的字典字典叫做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")
答案 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