If statement d.items()上循环内if语句的意外行为

If statement d.items()上循环内if语句的意外行为,if-statement,python-3.x,for-loop,dictionary,If Statement,Python 3.x,For Loop,Dictionary,使用Python3.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") 我希望打印“匹配”,但是我得到的是

使用Python3.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

如何让代码只打印正确的语句?非常感谢您的帮助。

字典没有顺序,因此
d
中的条目可能不会按您键入的顺序存储。因此,无法准确预测
d.items()
d
中迭代条目的顺序

当您迭代
d.items()
时,您正在迭代所有键、值对。因此,如果一对符合您的if条件,将打印
Match
。根据相同的推理,如果一对不符合您的if条件,则将打印不匹配项

在您的例子中,在
d.items()
的迭代过程中,键、值对的顺序与您输入它们的顺序正好相反。让我们来看看这个:

要考虑的第一个键、值对是
'john':'1230012'
。这与您的if条件不匹配。因此,
不打印匹配项

下一对是
'mohammed':'123456789'
,它确实符合您的if条件。因此,将打印
匹配

您可以通过在if语句之前添加
打印(k,v)
来确认这一点

现在,如果出于某种原因,您需要dictionary的功能,并且希望保持输入数据的顺序,那么我建议使用

在你的帖子中,你说“我希望打印
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")
首先,字典(Dict对象)是无序的,因此您无法确定首先访问/迭代哪个项

其次,从外观上看(假设),您希望输出只匹配或不匹配

你可以通过简单的布尔运算来实现这一点

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")

如果您想按顺序访问这些,可以将数据结构更改为

[('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")
然后,您可以在这个列表上进行迭代,得到如下内容

[('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")

Dicts是无序的,所以不知道它们的迭代顺序。“我建议你使用一台定购的电脑。”凯文,谢谢你的建议。我尝试使用OrderedDict,但输出同时执行这两条语句@Syed Mauze Rehan,不需要任何命令。字典的大小将少于100个键。你所说的完全正确。我确实包含了print(k,v),它在最后打印了k,v。那么,我可以假设字典不是执行这些任务的正确数据结构吗?@Mohammed:查看更新。我想你会找到你想要的谢谢你,ispectorG4dget,谢谢你对我的帮助。只打印一次匹配的代码就是我要找的。我在这里简化了这个问题。真正的业务是,我正在为某些应用程序设计登录屏幕界面,我决定将用户名和密码的组合存储在字典中,因为它们是不可变的,并且易于查找。顺便说一下,我正在自学Python。再次感谢你的帮助。@Mohammed:很高兴能帮上忙。注意:字典不是一成不变的——它们是非常可变的。也许您想要一个
frozendict
将数据结构从dict更改为元组列表的想法很棒。我现在正在做这件事。谢谢你的帮助。