2012-02-27 74 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