遍历字典值?

Posted

技术标签:

【中文标题】遍历字典值?【英文标题】:Iterate through dictionary values? 【发布时间】:2015-08-07 09:54:58 【问题描述】:

大家好,我正在尝试用 Python 编写一个充当问答游戏的程序。我在程序的开头制作了一个字典,其中包含用户将被询问的值。它的设置是这样的:

PIX0 = "QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"

所以我定义了一个函数,它使用for 循环遍历字典键并要求用户输入,并将用户输入与键匹配的值进行比较。

for key in PIX0:
    NUM = input("What is the Resolution of %s?"  % key)
    if NUM == PIX0[key]:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: %s." % PIX0[key] )

运行良好,输出如下所示:

What is the Resolution of Full HD? 1920x1080
Nice Job!
What is the Resolution of VGA? 640x480
Nice Job!

所以我想做的是有一个单独的功能,以另一种方式提出问题,为用户提供分辨率数字并让用户输入显示标准的名称。所以我想做一个 for 循环,但我真的不知道如何(或者你是否可以)迭代字典中的值并要求用户输入键。

我希望输出看起来像这样:

Which standard has a resolution of 1920x1080? Full HD
Nice Job!
What standard has a resolution of 640x480? VGA
Nice Job!

我尝试过使用for value in PIX0.values(),这让我可以遍历字典值,但我不知道如何使用它来“检查”用户对字典键的回答。如果有人可以提供帮助,将不胜感激。

编辑:抱歉,我使用的是 Python3。

【问题讨论】:

听起来您正在寻找通过字典中的值查找键的能力。这里有一个答案:***.com/questions/2568673/… 您使用的是哪个 Python 版本? 类似问题:Iterating over dictionaries using 'for' loops. 【参考方案1】:

取决于您的版本:

Python 2.x:

for key, val in PIX0.iteritems():
    NUM = input("Which standard has a resolution of !r?".format(val))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: !r.".format(key))

Python 3.x:

for key, val in PIX0.items():
    NUM = input("Which standard has a resolution of !r?".format(val))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: !r.".format(key))

您还应该养成使用 PEP 3101 中的新字符串格式化语法( 而不是 % 运算符)的习惯:

https://www.python.org/dev/peps/pep-3101/

【讨论】:

iteritems() 在 Python 3 中不受支持,我相信 OP 正在使用它。 没有任何迹象表明他正在使用哪个版本。 Python 2 和 3 都支持 print 语句上的括号,因此在 OP 说出他正在使用的版本之前,无法判断。 我的假设是基于print() 语句,而且,OP 在他的only other question 中使用了 Python 3,所以我认为他会使用相同的版本 抱歉,我正在使用 Python3 感谢这完美的工作。还要感谢您加倍努力并输入 Python 2 和 3 解决方案并提供字符串格式提示。【参考方案2】:

您可以搜索相应的键,也可以“反转”字典,但考虑到您的使用方式,最好首先迭代键/值 pairs ,您可以使用items() 进行操作。然后你就直接在变量中,根本不需要查找:

for key, value in PIX0.items():
    NUM = input("What is the Resolution of %s?"  % key)
    if NUM == value:

你当然可以同时使用这两种方式。

或者,如果您实际上不需要字典来做其他事情,您可以放弃字典并拥有一个普通的对列表。

【讨论】:

@chown 我正在使用 Python 3。没有 iteritemsitems 已经是你的意思。使用print 括号的OP 强烈建议他也在使用Python 3。【参考方案3】:

您可以只查找与键对应的值,然后检查输入是否等于键。

for key in PIX0:
    NUM = input("Which standard has a resolution of %s " % PIX0[key])
    if NUM == key:

此外,您必须更改最后一行以适应,因此如果您得到错误的答案,它将打印键而不是值。

print("I'm sorry but thats wrong. The correct answer was: %s." % key )

另外,我建议使用str.format 进行字符串格式化,而不是% 语法。

您的完整代码应如下所示(添加字符串格式后)

PIX0 = "QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"

for key in PIX0:
    NUM = input("Which standard has a resolution of ".format(PIX0[key]))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but that's wrong. The correct answer was: .".format(key))

【讨论】:

【参考方案4】:

如果你所有的值都是唯一的,你可以制作一个反向字典:

PIXO_reverse = v: k for k, v in PIX0.items()

结果:

>>> PIXO_reverse

'320x240': 'QVGA', '640x480': 'VGA', '800x600': 'SVGA'

现在你可以使用和以前一样的逻辑了。

【讨论】:

【参考方案5】:

创建相反的字典:

PIX1 = 
for key in PIX0.keys():
    PIX1[PIX0.get(key)] = key

然后在此字典上运行相同的代码(使用PIX1 而不是PIX0)。

顺便说一句,我不确定 Python 3,但在 Python 2 中,您需要使用 raw_input 而不是 input

【讨论】:

以上是关于遍历字典值?的主要内容,如果未能解决你的问题,请参考以下文章

遍历字典数组以查找值

Python遍历字典的几种方式

python3循环遍历嵌套字典替换指定值

如何遍历字典并更改值?

Python字典集合结构详解

6.3 遍历字典