在Python中,如何确定可迭代对象是否具有稳定的迭代顺序?

Pio*_*ost 4 python collections abstract-class iterator

在Python中,如何确定可迭代对象是否具有稳定的迭代顺序?

collections.Iterable抽象的基类,但没有稳定的对应类。

我问的原因是为了能够防止用户或不稳定的迭代顺序(警告他们,当他们通过考试(错误)迭代dictset等等)的函数,其中迭代的稳定性是至关重要的。

Bre*_*arn 5

您可能正在寻找的一件事是collections.Sequence。这比您想要的要具体一点,因为根据文档,序列“支持使用整数索引进行有效的元素访问”;它也不够具体,因为没有明确保证两次获取相同索引必须两次都返回相同值的问题。但这足以将列表和元组与字典和集合区分开。

但是,通常没有办法。通常,没有办法,因为您可以编写自己喜欢的任何可迭代对象,并且无需指定它是否稳定。例如,您可以执行以下操作:

>>> def f():
...     if random.random() < 0.5:
...         for a in xrange(10):
...             yield a
...     else:
...         stuff = range(10)
...         random.shuffle(stuff)
...         for a in stuff:
...             yield a
>>> list(f())
0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(f())
1: [7, 0, 2, 8, 5, 1, 4, 3, 6, 9]
Run Code Online (Sandbox Code Playgroud)

无需声明迭代器是否稳定就可以编写迭代器的事实,再加上无法通过迭代来判断是否以后将以相同的方式进行迭代的事实,这意味着不可能没有迭代器判断给定迭代器是否稳定的方法。

我建议您简单地记录一下您的函数需要迭代顺序的稳定性。您还可以显式检查您知道可能不稳定的内置类型,并在这些类型上引发错误。但是,通常没有办法检查用户定义的任意迭代器的稳定性。