5

所以我创建了一个字典来设置一个小游戏的难度级别。

diff_dict = {'easy':0.2, 'medium':0.1, 'hard':0.05} # difficulty level dict

键将是难度名称和值,我将使用一些比率来计算难度。

所以我试图弄清楚如何只向用户打印密钥:

print('\nHere are the 3 possible choices: ',diff_dict.keys())

这将打印为:

Here are the 3 possible choices:  dict_keys(['hard', 'easy', 'medium'])

显然我不想显示字典名称,所以我继续搜索,我确实找到了一个可行的解决方案:

diff_keys = diff_dict.keys()
print ('\nHere are the 3 possible choices: ',list(diff_keys))

但是我还是想知道有没有其他的方法可以实现这个,那为什么等等。所以我在这里用Qs:

  1. 我可以在不创建新元素(例如 diff_keys)的情况下获得相同的结果吗?

  2. 为什么diff_dict.keys显示字典。姓名?难道我做错了什么?

  3. 附带说明一下,如何在没有字符串引号 (') 的情况下打印键或其他元素,如列表、元组等?

  4. 与上面的 #3 相同,但括号 ([ ])

谢谢和cheerio :-)

4

1 回答 1

14

问题是,在 Python 3 中,dict 的方法keys()不返回一个列表,而是一个特殊的视图对象。该对象有一个魔术__str__方法,每次您使用该对象时都会在后台调用print该对象;因此对于通过调用创建的视图对象进行keys() __str__定义,以便生成的字符串包含"dict_keys".

寻找自己:

In [1]: diff_dict = {'easy': 0.2, 'medium': 0.1, 'hard': 0.05}

In [2]: print('Here are the 3 possible choices:', diff_dict.keys())
Here are the 3 possible choices: dict_keys(['medium', 'hard', 'easy'])

In [3]: diff_dict.keys().__str__()
Out[3]: "dict_keys(['medium', 'hard', 'easy'])"

请注意,99.9% 的时间您不需要直接调用此方法,我这样做只是为了说明事情是如何工作的。

一般来说,当你想打印一些数据时,你几乎总是想做一些字符串格式化。但是,在这种情况下,一个简单的str.join就足够了:

In [4]: print('Here are the 3 possible choices:', ', '.join(diff_dict))
Here are the 3 possible choices: medium, hard, easy

所以,回答你的问题:

我可以在不创建新元素(例如 diff_keys)的情况下获得相同的结果吗?

上面显示了一个示例。

为什么 diff_dict.keys 显示字典。姓名?难道我做错了什么?

因为它的__str__方法就是这样工作的。这是“直接”打印对象时必须处理的问题。

如何在没有字符串引号 (') 的情况下打印键或其他元素,如列表、元组等?

与上面的 #3 相同,但括号 ([ ])

打印它们,这样它们__str__就不会被调用。(基本上,不要打印它们。)以您喜欢的任何方式构造一个字符串,将您的数据制作到其中,然后打印它。您可以使用字符串格式化,以及许多有用的字符串方法

于 2012-11-28T20:18:14.600 回答