当前位置: 首页 > 知识库问答 >
问题:

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

翟俊哲
2023-03-14

使用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个答案

公西俊德
2023-03-14

首先,字典(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")
慕容越泽
2023-03-14

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

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

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

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

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

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

现在,如果由于某种原因,你想要字典的功能,并且你想要保持你输入数据的顺序,那么我建议你使用集合。有序词典

在您的帖子中,您说“我希望打印< code>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")

这将打印< code>Match,只要有与if条件匹配的键、值对。但是,如果即使有多对匹配If条件,您也希望只打印一次< code>Match,那么您可以对上面的代码做一个小小的修改:

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")
 类似资料:
  • if语句 (实际上是if表达式) OCaml有两种if语句: if boolean-condition then expression if boolean-condition then expression else other-expression 不同于传统的语言,if语句是表达式。它们更类似于C类语言中的三元操作符?: 而不是你所熟悉的if语句。 下面是if语句的简单例子: # le

  • 数据库表: 胶片(id\U胶片主键,名称) 流派(id_genrePK,名称) film_genre(id_filmFK,id_genreFK) 这将输出流派表中的所有流派: 这将输出特定电影的电影类型表中的所有选定类型: 我有一个问题,从数据库输出数据到多个选定的列表中的形式。这是一个电影数据库,我正在进行Foreach迭代,以读取电影流派的所有行,并输出到多个选择字段。但是我在向列表输出“选定

  • 所以程序应该是:-获取用户的输入,直到用户键入“n或N”以显示停止的标志-当用户键入“n或N”时,程序正数和负数和。 还有我得到的 这个错误信息,我不知道是什么问题。提前谢谢你!

  • 问题内容: 目前无法打破此循环。如果要在此列表中找不到变量,我想破坏它,以便它可以移动另外两个循环。它期望在循环的顶部有一个缩进的块,但是如果更改循环的开头或开头的位置,它将无法正常工作。救命! 问题答案: 正如人们在对您的问题的评论中提到的那样,您需要分别打破每个循环,仅停止其所在的循环 两个 循环都需要这样做 如果您也想打破while循环,那么您也可以添加该循环。

  • 我有一个380行20列的表格。我想从该表中删除符合特定条件的行。 为了澄清问题,假设我有以下列表: 我想删除在列表中找到姓名的所有人员的数据。 例如,假设我的数据如下所示: 我想删除、和的数据。所以输出应该是: 我的代码正在运行,但数据没有从我的原始数据中删除。当我打开新的测试.txt文件时,我可以看到数据没有被删除。 我可以肯定错误在< code > if data[row][0]= =(I f

  • 1、什么是循环语句 一般编程语言都有循环语句,为什么呢? 那就问一下自己,我们弄程序是为了干什么? 那肯定是为了方便我们工作,优化我们的工作效率啊。 而计算机和人类不同,计算机不怕苦也不怕累,也不需要休息,可以一直做。 你要知道,计算机最擅长就是做重复的事情。 所以这时候需要用到循环语句,循环语句允许我们执行一个语句或语句组多次。 循环语句的一般形式如下: 在 Python 提供了 for 循环和