如何切片 OrderedDict?

问题描述

我尝试像这样对 OrderedDict 进行切片:

for key in some_dict[:10]:

但是我收到一个 TypeError 说“不可散列的类型:'sl​​ice'”。我如何获得这本字典的前 10 个键值对?

解决方法

尝试将 OrderedDict 转换为可切片的内容:

list_dict = list(some_dict.items())

for i in list_dict[:10]:
  # do something

现在每个键值对都是一个二项元组。 (索引 0 是键,索引 1 是值)

,

OrderedDict 仅用于维护顺序,而不是按该顺序中的位置提供有效的查找。 (在内部,它们使用双向链表维护顺序。)OrderedDicts 无法提供高效的一般情况切片,因此它们不实现切片。

对于您的用例,您可以改为使用 itertools 在 10 个元素后停止循环:

import itertools

for key in itertools.islice(your_odict,10):
    ...

for key,value in itertools.islice(your_odict.items(),10):
    ...

在内部,一旦到达第 10 个项目,islice 将停止从底层 OrderedDict 迭代器获取项目。请注意,虽然您可以告诉 islice 使用步长值或非零起始值,但它不能有效地这样做 - 它必须获取并丢弃您想要跳过的所有值才能找到您想要的值重新感兴趣。