在python中检测有序的iterables(序列)

时间:2016-06-28 23:10:42

标签: python

我正在尝试构建一个带有iterable并返回元组的函数,前提是iterable将始终以规范的方式迭代。例如,如果输入可迭代是listtuple - 就像,我想接受输入,但是如果它是dict - 则不喜欢(在没有保证的情况下)按键的顺序)。是否有任何python函数来检测总是以相同顺序迭代的对象之间的差异,而不是命令可以更改版本到版本或取决于PYTHONHASHSEED的那些?

isinstance(x, collections.Sequence)完成我想要的大部分工作,但生成器不是序列。下面的代码似乎做了我想要的,但是我不确定我是否会遗漏某些内容,或者是否有更通用的方法来捕获有序但不一定可索引的可迭代的概念。

import collections, types
def to_tuple(x):
    if isinstance(x, collections.Sequence) or isinstance(x, types.GeneratorType):
        return tuple(x)
    raise Exception("Cannot be iterated canonically")

2 个答案:

答案 0 :(得分:2)

没有这样的功能。即使使用发电机,您也希望能够捕获

(x for x in {1, 2, 3})

但允许

(x for x in [1, 2, 3])

我建议只在type(x) is dict时发出警告。甚至不是isinstance(x, dict),因为OrderedDicts是有序的。

答案 1 :(得分:1)

您可能想要检查切片操作是否已定义:

def to_tuple(x):
  return tuple(x[:])

排除字典,生成器,但欢迎字符串,元组,列表......