【问题标题】:How does the `for` loop work on dictionaries specifically`for` 循环如何专门用于字典
【发布时间】:2016-07-10 12:58:15
【问题描述】:

我想知道for 循环究竟是如何访问字典中的键的? 它会调用dict.keys() 并遍历该列表吗?

我问的原因是我想查询字典的键,任何键,我想知道调用之间是否存在性能差异(除了视觉效果和可读性):

for key in dict:
    my_func(dict[key])
    break

my_func(dict.keys()[0]) 

这让我想到了上述问题——python 在dicts 上的for 循环期间做了什么,特别是在引擎盖下?

【问题讨论】:

  • dict[key]dict.keys()[0] 一样吗?在 OP 中,dict[key] 应该返回一个值,而 dict.keys()[0] 应该返回一个键
  • 查看PEP 234中的迭代器协议
  • 你是问还是说?由于dicts 是无序的,因此它们不会是相同的,如果是偶然或运气或其他原因的话。

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


【解决方案1】:

迭代dict 不会调用dict.key()。字典本身支持迭代。

>>> iter({'name': 'value'})
<dict_keyiterator object at 0x7f127da89688>

顺便说一句,Python 3.x 中的dict.keys 返回不支持索引的字典键视图。

>>> {'name': 'value'}.keys()
dict_keys(['name'])
>>> {'name': 'value'}.keys()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support indexing

如果你想获取任意key,可以使用nextiter

>>> next(iter({'name': 'value', 'name2': 'another value'}))
'name'

>>> next(iter({}))  # <--  To handle empty case, pass default value
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next(iter({}), 'default value')
'default value'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2020-05-30
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多