使用Python 3.3我想循环遍历d.items()并根据if条件返回匹配。这是代码:
d = {'mohammed': '123456789', 'john': '1230012'}
for k, v in d.items():
if k == 'mohammed' and v == '123456789':
print("Match")
else:
print("No Match")
我希望打印"匹配"但是我得到的是两个语句都反向打印,即
No Match
Match
如何让代码打印出正确的声明?任何帮助表示赞赏。
答案 0 :(得分:1)
字典未订购,因此d
中的条目可能不会按您键入的顺序存储。因此,无法准确预测d.items()
对d
中的条目进行迭代的顺序。
当您遍历d.items()
时,您将迭代所有键值对。因此,如果一对与if条件匹配,则会打印Match
。基于同样的原因,如果一对与if条件不匹配,则会打印No Match
。
在您的情况下,迭代d.items()
期间的键值对的顺序与您输入它们的顺序完全相反。我们来看看这个:
要考虑的第一个键值对是'john': '1230012'
。这与您的if条件不符。因此会打印No Match
。
下一对是'mohammed': '123456789'
,它与你的if条件匹配。因此会打印Match
。
您可以在if语句
之前添加print(k,v)
来确认
现在,如果出于某种原因,您想要字典的功能,并且希望保持您输入数据的顺序,那么我建议您使用collections.OrderedDict
在你的帖子中,你说"我希望打印Match
"。因此,我认为,您正在寻找的是一种检查字典中是否有任何键,值对满足您的if条件的方法。您可以通过以下两种方式完成此任务:
d = {'mohammed': '123456789', 'john': '1230012'}
found = False
for k,v in d.items():
if k == 'mohammed' and v == '123456789':
print("Match")
found = True
if not found: # equivalently, if found == False:
print("No Match")
这将打印Match
多次,因为有与您的if条件匹配的键值对。但是,如果您想要打印Match
一次,即使多个对符合您的if条件,那么您只需对上述代码进行一些小修改:
d = {'mohammed': '123456789', 'john': '1230012'}
found = False
for k,v in d.items():
if k == 'mohammed' and v == '123456789':
found = True
if found:
print("Match")
else:
print("No Match")
当然,所有这一切都有一个方便的单行程序:
if any(k == 'mohammed' and v == '123456789' for k,v in d.items()):
print("Match")
else:
print("No Match")
答案 1 :(得分:1)
首先,字典(Dict对象)是无序的,因此您无法确定首先访问/迭代哪个项目。
其次,通过它的外观(假设)你想要一个输出的匹配或 No Match 。
你可以通过简单的布尔值来做到这一点;
matched = False
for k, v in d.items():
if k == 'mohammed' and v == '123456789':
print("Match")
matched = True
break
if not matched:
print("No Match")
OR
如果要按顺序访问这些内容,可以将数据结构更改为
[('muhammad','somevalue'),(),...]
然后你可以迭代这个列表并有类似
的东西for obj in d:
t_val_1, t_val_2 = obj
if t_val_1 == 'mohammed' and t_val_2 == '123456789':
print("Match")
else:
print("No Match")