【问题标题】:How can I check if a Python collection is ordered?如何检查 Python 集合是否已订购?
【发布时间】:2020-12-11 15:18:05
【问题描述】:

我想检查一个已经传递给函数的集合是否是有序的,即元素的顺序是固定的。 (我不是在说“排序”。)

  • set 未订购。
  • lists 和 tuples 已订购。

是否有我可以使用的通用测试?

【问题讨论】:

    标签: python collections


    【解决方案1】:

    有序的非映射集合通常实现sequence protocol(其主要特点是通过__getitem__方法提供索引访问)并且可以针对collections.abc.Sequence进行类型测试:

    from collections.abc import Sequence
    
    isinstance(set(), Sequence)
    # False
    isinstance(list(), Sequence)
    # True
    isinstance(tuple(), Sequence)
    # True
    

    如果有人坚持应该包含有序映射,即 dict (ordered as of Python 3.7),您可以针对 collections.abc.Reversible 进行测试:

    isinstance(set(), Reversible)
    # False
    isinstance(list(), Reversible)
    # True
    isinstance(tuple(), Reversible)
    # True
    isinstance(dict(), Reversible)
    # True
    

    【讨论】:

    • False 代表dict()。即使在 Python 3.9 中。
    • 是的,这很令人惊讶吗? dict 一个映射。
    • 不是。这才是重点。如果我将这里的任何内容称为“令人惊讶”,那么即使它不适用于其中一种主要数据类型,它也已被接受。
    • 我还是不明白。 dict(就像一个集合)显然不是一个序列,所以它工作得很好。它是not non-mapping,它是not ordered,它的__getitem__方法是 提供索引访问,而是键控访问。所以它没有答案提到的序列的三个属性中的任何一个。
    • dicts 订购。自从 Python 3.7 以来,它已经出现了将近 2.5 年。它们也是集合,这就是问题所在(它说了三遍)。有序集合。字典是。这个答案的方法不能确定。
    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多