我想按字典顺序比较两个列表,但列表中的值应在需要时计算。例如,对于这两个列表变量的惰性评估
a = list([1, 3, 3])
b = list([1, 2, 2])
(a < b) == False
(b < a) == True
我想在列表中的值是功能和在使索引a
和b
,该值(即各功能)= 2的情况将不被评价因为index = 1(a[1]==3, b[1]==2
)的值已经足以确定b < a
。
一个选择是手动比较元素,当我找不到允许使用列表比较器的解决方案时,我可能会这样做,但是我发现手动循环稍慢于该列表的内置比较器,这就是为什么我想要使用它。
更新
下面是完成什么,我试图做的一种方式,但我不知道是否有任何内置的功能,将做到这一点更快(这使得使用列表这个特性)。
def lex_comp(a, b):
for func_a, func_b in izip(a, b):
v_a = func_a()
v_b = func_b()
if v_a < v_b: return -1
if v_b > v_a: return +1
return 0
def foo1(): return 1
def foo2(): return 1
def bar1(): return 1
def bar2(): return 2
def func1(): return ...
def func2(): return ...
list_a = [foo1, bar1, func1, ...]
list_b = [foo2, bar2, func2, ...]
# now you can use the comparator for instance to sort a list of these lists
sort([list_a, list_b], cmp=lex_comp)
你是什么意思是“我想列表中的值是函数”,那么它最终是一个评估值或者一个函数(用什么参数?)? – YiFei
有趣的问题 - 可能是[itertools.takewhile()](https://docs.python.org/2/library/itertools.html#itertools.takewhile)的工作? – FujiApple
如果不是用数字显示示例,而是展示了一个如何让它与您的函数一起工作的示例,这将有所帮助。 – BrenBarn