【问题标题】:How do I slice an OrderedDict?如何切片 OrderedDict?
【发布时间】:2021-04-06 06:47:27
【问题描述】:

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

for key in some_dict[:10]:

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

【问题讨论】:

  • dict 对象不可切片

标签: python python-3.x slice ordereddict


【解决方案1】:

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

list_dict = list(some_dict.items())

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 既然OP想要“键值对”,不应该是itertools.islice(your_odict.items(), 0, 10)吗?
    • @martineau:这并不重要。您可以索引 dict 以获取值。他们在问题中选择了for key in some_dict[:10]:,所以我坚持使用最接近答案的内容。
    猜你喜欢
    • 2015-09-07
    • 2021-02-19
    • 1970-01-01
    • 2015-03-10
    • 2011-12-23
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多