给定一个任意的集合,有没有方法来判断它是否是有序的?

2024-03-28 18:13:18 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我目前所掌握的情况:

def is_ordered(collection):
    if isinstance(collection, set):
        return False
    if isinstance(collection, list):
        return True
    if isinstance(collection, dict):
        return False

    raise Exception("unknown collection")

有更好的方法吗?在

NB:我的意思是有序的,不是排序的。在

动机:

我想迭代一个有序的集合。e、 g

^{2}$

在这种情况下,优先次序是很重要的。这是什么样的收藏不是。我在试着活生生地打字。我经常被劝阻不要让Python进行类型检查。在


Tags: falsetruereturnifisdef情况dict
3条回答

如果集合确实是任意的(意味着它可以是任何类别的),那么答案必须是。在

基本上,有两种可能的方法:

  1. 了解每一个可能出现在你的方法中的类,以及它是否是有序的
  2. 通过在集合中插入所有可能的键组合来测试集合,并查看是否保留了顺序。在

后者显然是不可行的。前者与您已有的类似,只是您必须了解每个派生的类,比如collections.OrderedDict;检查{}是不够的。在

坦白地说,我认为整个is_ordered检查是一堆蠕虫。你为什么要这么做?在

我认为枚举90%的大小写就和你将得到的一样好(如果使用python3,用str替换basestring)。可能还需要考虑如何处理生成器表达式和类似的ilk(同样,如果使用Py3,请跳过xrangor):

generator = type((i for i in xrange(0)))
enumerator = type(enumerate(range(0)))
xrangor = type(xrange(0))
is_ordered = lambda seq : isinstance(seq,(tuple, list, collections.OrderedDict,
                                          basestring, generator, enumerator, xrangor))

如果呼叫者开始使用itertools,那么还需要添加islice、imap、groupby返回的itertools类型。但这些特殊情况的数量确实开始指向code smell。在

更新:实际上,您是在尝试对传递给您的参数进行单元测试。停止这样做,对你自己的代码进行单元测试。测试您的使用者(确保它能与有序集合一起工作),并对调用它的代码进行单元测试,以确保它获得正确的结果。在

在静态类型语言中,您只需将自己限制为特定类型。如果您真的想复制它,只需指定您接受的类型,并测试这些类型。如果传递了任何其他内容,则引发异常。它不是Python,但它可靠地实现了你想做的事


你有两种可能的方法:

  1. 任何使用append方法的东西几乎肯定是有序的;并且
  2. 如果它只有一个add方法,您可以尝试添加一个nonce值,然后迭代该集合以查看该nonce是否出现在末尾(或者,可能出现在一端);您可以尝试添加第二个nonce,然后再次执行该操作,以便更加自信。在

当然,如果集合是空的,或者有一个排序函数不能在结尾处产生加法,那么这是行不通的。在

也许更好的解决方案是简单地指定代码需要有序集合,而只传递有序集合。在

相关问题 更多 >