下面是与我的问题相关的简化示例。我认为这些函数应该具有完全相同的行为:
def f1(l):
if type(l[0][0])==list: f=lambda x:x[0][0]
else: f=lambda x:x[0]
l.sort(key=f,reverse=True)
def f2(l):
f=lambda x:x[0][0] if type(l[0][0])==list else lambda x:x[0]
l.sort(key=f,reverse=True)
l=[[1,2],[3,4]]
但实际上,当f2(l)
发生异常时,f1(l)
仍然可以正常工作:
IndexError: list index out of range
那么问题是为什么会这样,是否可能使用返回其中一个函数的三元运算符?
def getKey(x):
来检查x
并返回x[0]
或x[0][0]
或者你需要的任何东西?然后使用l.sort(key=getKey,reverse=True)
。 - Asad Saeeduddinf1
或f2
时都要创建函数的开销,因此如果有什么区别,它可能会(微不足道地)更高效。 无论如何,我不认为这种差异值得担心。 - Asad Saeeduddinlambda
作为key
,而getkey
方法则检查列表中的每个元素,并且每次都做出相同(冗余)的决策。我进行了一些测试。测试结果显示原始方法大约比getkey
方法快2倍。虽然对于我的任务来说这并不太重要。在这种情况下,我投票支持可读性。 - NikgetKey
返回正确的lambda,并且使用l.sort(key=getKey(l),reverse=True)
。 - Asad Saeeduddin