2012-05-02 110 views
1

這是我到目前爲止有:鑑於任意收集,有沒有辦法判斷它是否有序?

def is_ordered(collection): 
    if isinstance(collection, set): 
     return False 
    if isinstance(collection, list): 
     return True 
    if isinstance(collection, dict): 
     return False 

    raise Exception("unknown collection") 

是否有更好的方法來做到這一點?

注:我的意思是有序和不是排序。

動機:

我要遍歷的有序集合。例如

def most_important(priorities): 
    for p in priorities: 
     print p 

在這種情況下,優先級排序的事實很重要。它不是什麼樣的收藏品。我想在這裏住鴨子打字。我經常被Pythonistas的類型檢查阻止。

+4

你的代碼已經失敗了'collections.OrderedDict'的實例 –

+0

和其他我假設的其他人。關鍵是,我是否需要測試每一個可能的集合,還是有更強大的方法來做到這一點? – cammil

+2

只需對其進行迭代,並確保調用者正在傳遞一個有序集合。 – Marcin

回答

4

如果收集真的是任意的(意味着它可以是任何類別的),那麼答案必須是

基本上有兩種可能的方法:

  1. 瞭解,可以呈現給你的方法每一個可能的類,並且無論是有序的;
  2. 通過插入每個可能的組合鍵來檢查集合,並查看是否保留排序。

後者顯然是不可行的。前者符合你已有的內容,除了你必須知道每個派生的類,例如collections.OrderedDict;檢查dict是不夠的。

坦率地說,我認爲整個is_ordered檢查是一個蠕蟲的罐頭。無論如何,你爲什麼要這麼做?

+0

我可以放置的標準限制可能有用嗎?還是應該像我一樣採取課堂檢查? – cammil

+0

@cammil爲什麼不僅僅指定使用人類語言(如英語)只需要傳遞訂購集合,並檢查您的調用代碼以確保您能夠做到這一點? – Marcin

+0

請參閱編輯。這是否回答你的問題? – cammil

-1

如果列表沒有排序,例如[1,3,2]

+2

[1,3,2] _is_命令。它沒有排序。 – cammil

+0

我不知道你是什麼意思的「命令」呢?但我同意艾克斯寫道 - 你真的不行。任何人都可以執行例如命令的「字典」。集合庫中有一個OrderedDict類。 – uhz

+1

@uhzzre:取一個像「」你好「的字符串。它被命令(=字符順序)。它沒有排序,雖然它會是「ehllo」。 –

1

更新:從本質上講,您試圖單元測試傳遞給您的參數。停止這樣做,然後單元測試你自己的代碼。測試你的消費者(確保它與有序集合一起工作),然後單元測試調用它的代碼,以確保它獲得正確的結果。

在靜態類型語言中,您只需將自己限制爲特定類型。如果您真的想要複製它,只需指定您接受的唯一類型,然後測試這些類型。如果有其他事情通過,則引發異常。這不是Python的,但它可靠地實現你想要做什麼


好了,你有兩種可能的方法:

  1. 任何與append方法幾乎可以肯定是有序的;和
  2. 如果它只有一個add方法,您可以嘗試添加一個臨時值,然後遍歷該集合以查看臨時值是否出現在末尾(或可能在一端);您可以嘗試添加第二個隨機數,然後再次執行,以增強自信。

當然,這不起作用,例如,該集合是空的,或者有一個排序函數不會導致在結尾添加。

也許更好的解決方案是簡單地指定您的代碼需要有序集合,並且只傳遞它的有序集合。

0

我認爲枚舉90%的情況與你將要得到的一樣好(如果使用Python 3,用str替換basestring)。可能還需要考慮你會如何處理生成的表情和類似之流,太(再次,如果用PY 3,跳過xrangor):

generator = type((i for i in xrange(0))) 
enumerator = type(enumerate(range(0))) 
xrangor = type(xrange(0)) 
is_ordered = lambda seq : isinstance(seq,(tuple, list, collections.OrderedDict, 
              basestring, generator, enumerator, xrangor)) 

如果來電者開始使用itertools,那麼你還需要添加itertools類型,由islice,imap,groupby返回。但這些特殊案例的數量真的開始指向code smell

相關問題