【问题标题】:Print Dictionary Keys without Dictionary Name? How/why?打印没有字典名称的字典键?如何/为什么?
【发布时间】:2012-11-16 19:20:51
【问题描述】:

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

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

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

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

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

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

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

感谢和欢呼:-)

【问题讨论】:

    标签: python printing dictionary python-3.x key


    【解决方案1】:

    问题是,在 Python 3 dict 的方法 keys() 中不返回一个列表,而是一个特殊的 view object。该对象有一个magic __str__ method,每次您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% 的情况下您不需要直接调用此方法,我这样做只是为了说明事情是如何工作的。

    一般来说,当你想打印一些数据时,你几乎总是想做一些string formatting。不过,在这种情况下,一个简单的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__。 (基本上,不要打印它们。)以您喜欢的任何方式构造一个字符串,将您的数据制作到其中,然后打印它。您可以使用字符串格式,以及许多有用的string methods

    【讨论】:

    • 缺少的重点是the difference between __str__ and __repr__。 dict_keys 覆盖__repr__(用于__str__)。 repr 的用途也解释了为什么它包含 ' 用于字符串。
    • @JFSebastian 坦率地说,我故意省略了它,以免细节过多,因为 OP 对 Python 来说似乎是新的,用例并不需要完全理解差异在__repr____str__ 之间(恕我直言)。因此,如果您不介意,我不希望将其编辑为答案。不过,最好将此作为“进一步阅读”的参考。谢谢你的评论:)
    • @JFSebastian:实际上,您必须更深入才能真正回答#4:在listtuple 上调用__str__ 调用__repr__ 而不是__str__在它的每一个元素上。但我同意 Lev 的观点,即这在 cmets 中完全没问题,而不是答案。
    • 非常感谢您提供的信息,效果很好,我学到了很多东西。您也可以尝试回答这个问题吗?为什么 str.join(dict) 只返回 str 键,而我必须指定 join(dict.values) 才能获取 str 值,默认情况下这只是键吗?如果我想对 str 键和值都使用 str.join 怎么办?干杯。
    • @Newbie 还有另一种神奇的方法可以解释这一点,它被称为__iter__。它定义了迭代对象时每一步得到的结果。当你遍历一个字典时,你会得到它的键。查看here 并向下滚动到iter(d)。另外作为一个简单的实验,您可以尝试for k in diff_dict: print(k)。要同时获取键和值,请使用 dict.items()
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多