4

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

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

我问的原因是能够阻止用户或警告他们,当他们(错误地)以不稳定的迭代顺序(dictset等)迭代到迭代稳定性至关重要的函数时。

4

1 回答 1

6

您可能正在寻找的一件事是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]

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

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

于 2012-09-25T20:52:44.837 回答