2012-02-27 42 views
2

什麼是代表Python中列表元素之間任意total order的優雅方式,例如,函數torder在以下示例中(其中C> B> A)。 編輯:我假設該列表定義的順序:Python中的全部訂單

>>> s = ['A','B','C'] 
>>> torder('B') 
['A'] 
>>> torder('C') 
['A','B'] 

我能做到這一點使用如果ELIF如果列表很短,但一直在尋找一些更Python。

+3

注意'ord'是一個內置的功能:http://docs.python.org/library /functions.html#ord。將您的功能稱爲相同的名稱可能不是一個好主意。 – Hooked 2012-02-27 14:44:50

+0

@Hooked剛剛改變了它 – Vladtn 2012-02-27 14:47:22

+0

你用什麼函數?定義一個訂單最常用的接口是一個比較函數,或者如果你的集合是同構於整數/浮點數/字符串/元組的子集,那麼你使用「鍵」函數。後者非常適合分類。我不認爲「一個返回一個包含所有小於它的參數的元素的列表的函數」是一種表達順序的優雅方式,不管這個函數是如何實現的,除非你以一種非常具體的方式使用這個順序,你永遠不需要成對比較。 – 2012-02-27 15:10:35

回答

4
def orde(i, s): 
    t = sorted(s) 
    return t[:t.index(i)] 

s = ['A','B','C'] 
orde("B", s) 
+0

非常好!我只用['A','B','C']作爲示例,並假定列表已經排序,但返回t [:t.index(i)]的簡潔性很好。 – Vladtn 2012-02-27 14:45:50

3
import itertools 
itertools.takewhile(lambda x: x != 'C', s) 

如果爲了不被在列表中的位置定義:

sorted(filter(lambda x: x < 'C', s)) 
+0

這假設輸入是排序的。 – 2012-02-27 14:45:32

+4

@Tichodroma:我認爲列表定義了順序..哦,讓我們希望他下次給出一個很好的例子。 – 2012-02-27 14:46:30

+0

是的,它包含:'list(itertools.takewhile(lambda x:x!='Z',['A','B','C','Z','X','Y'])) ''A','B','C'],而不是'['A','B','C','X','Y']'。 – 2012-02-27 14:48:42