在d.items()循环内部的if语句的意外行为

时间:2014-12-16 18:21:20

标签: if-statement python-3.x for-loop dictionary

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

如何让代码打印出正确的声明?任何帮助表示赞赏。

2 个答案:

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