簡體   English   中英

如何判斷Python中的結構是否有順序?

[英]How can I tell if a structure in Python has order?

我正在為剛接觸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
>>>

當然,對於這種情況,您應該使用集合。僅限序列。

>>> 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 or 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
>>> 

А關於訂單。

如果你不確定物品的順序,我認為你應該明確檢查它們。

«明確比隱含更好。»

>>>
>>> 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
>>>

但是,老實說,生成器保證訂單與您在其中生成的訂單相同。

您還沒有完全描述您擁有“訂單”的財產的含義; 你的“可贖回”是個好主意。 我建議您通讀“dunder”(雙下划線)方法來查看其中一個是否符合您想要的定義。 根據你給我們的內容,我強烈懷疑__getitem__是你想要的。 還有“請求寬恕”方法在結構上設置try-except塊:

try:
    dummy = (_ for _ in result)
    has_order = True
except:
    has_order = False
return has_order

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM