gpt4 book ai didi

python - 如何判断 Python 中的结构是否有序?

转载 作者:太空狗 更新时间:2023-10-29 19:29:13 25 4
gpt4 key购买 nike

我正在为 Python 新用户编写一组测试用例。我在测试中注意到的问题之一是可能会出现误报。他们可能很幸运,碰巧以正确的顺序给出了每个元素,但他们确实应该使用有序的结构。

到目前为止,这是我能想到的最佳解决方案。

self.assertTrue(isinstance(result, Sequence) or
isinstance(result, GeneratorType) or
callable(getattr(result, '__reversed__', False)))

但是,我不确定 GeneratorType 是否真的有序,或者这个测试是否全面。我觉得应该有更好的方法来对此进行测试。如何测试结构是否有序?

最佳答案

我认为,这是一个非常有趣的问题。纯 python 中没有办法(没有实用程序代码)检查是否已订购集合。

让我们按顺序进行 =)

检查 SequenceGeneratorType你可以使用 collections.Iterable 类型。

>>>
>>> import collections
>>>
>>> result = [1,2,3,4,-1]
>>> isinstance(result, collections.Iterable)
True
>>>
>>> def generator_func(arg=10):
... for i in xrange(arg):
... yield i
...
>>>
>>> generator_func()
<generator object generator_func at 0x7f667c50f190>
>>>
>>> result = generator_func()
>>> isinstance(result, collections.Iterable)
True

但是:

>>>
>>> result = {1,2,3,4,-1}
>>> isinstance(result, collections.Iterable)
True
>>>

这对你来说很糟糕。因为:

>>> x = {1,2,3,-1}
>>> x
set([1, 2, 3, -1])
>>> [_ for _ in x]
[1, 2, 3, -1]
>>> x = {1,2,3,0}
>>> x
set([0, 1, 2, 3])
>>> [_ for _ in x]
[0, 1, 2, 3]
>>> import collections
>>> isinstance(x, collections.Iterable)
True
>>>

当然,对于这种情况,您应该仅使用 collections.Sequence。

>>> result = {1,2,3,4,-1}
>>> isinstance(result, collections.Sequence)
False
>>> isinstance({1:2, 3:3}, collections.Sequence)
False
>>>

但是:

>>> result = generator_func()
>>> isinstance(result, collections.Sequence)
False
>>>

因此,我认为检查 Sequence 或 GeneratorType 的想法很好。检查此链接:

所以:

>>> result = generator_func()
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = [1,2,3,4,5]
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = (1,2,3,4,5)
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = {1,2,3,4,5}
>>> isinstance(result, (collections.Sequence, collections.Iterator))
False
>>> result = {1:1,2:2,3:3,4:4,5:5}
>>> isinstance(result, (collections.Sequence, collections.Iterator))
False
>>>

关于订单。

如果您不确定元素的顺序,我认为您应该明确检查它们。

«Explicit is better than implicit.»

>>>
>>> def order_check(result, order_rule = cmp_rule):
... for item, next_item in zip(result, result[1:]):
... if not order_rule(item, next_item):
... return False
... return True
...
>>> def cmp_rule(item, next_item):
... if item < next_item:
... return True
... return False
...
>>>
>>> result = [1,2,3,4,5]
>>> order_check(result)
True
>>> result = [1,2,3,4,5,-1]
>>> order_check(result)
False
>>>

但是,老实说,生成器保证该订单将与您在其中生成的订单相同。

关于python - 如何判断 Python 中的结构是否有序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33402089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com