使用自定义比较函数python对列表列表进行排序

时间:2015-07-01 11:48:30

标签: python sorting

我试图在python中对列表列表进行排序,但它似乎无法正常工作。

def get(l):
        return l[1]

def com(x,y):
        return len(x) < len(y)

x = [['jis','1,2334'],['hshshau','123'],['sjuaj','3214']]
x.sort(cmp=com,key=get)

输出

[['jis', '1,2334'], ['hshshau', '123'], ['sjuaj', '3214']]

如何按第二元素的递增顺序实现列表?感谢。

2 个答案:

答案 0 :(得分:2)

您不需要cmp这里只需使用key

>>> x = [['jis','1,2334'],['hshshau','123'],['sjuaj','3214']]
>>> 
>>> x.sort(key=lambda x:len(x[1]))
>>> x
[['hshshau', '123'], ['sjuaj', '3214'], ['jis', '1,2334']]
>>> 

您需要知道sort函数会根据key对列表元素进行排序,此处您的密钥不会考虑元素的长度。你只是根据第二个元素进行排序,sort将根据第二个元素lexicographicaly对你的列表进行排序!

有关python sort函数的更多信息,请阅读https://docs.python.org/2/library/functions.html#sorted

答案 1 :(得分:1)

就像@Kasra说你不需要使用cmp参数,你可以只使用密钥,如果你想把第二个元素视为整数(数字)你可以替换','和' '(假设只有,将进入)(空字符串),然后转换为int并使用,以便相同长度的数字也正确排序。

示例 -

>>> x = [['jis','1,2334'],['hshshau','123'],['sjuaj','3214'],['nbhd','1,841']]
>>> x.sort(key = lambda x: int(x[1].replace(',','')))
>>> x
[['hshshau', '123'], ['nbhd', '1,841'], ['sjuaj', '3214'], ['jis', '1,2334']]

来自cmp class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput()) def clean_username(self): username = self.cleaned_data.get("username") try: user = User.objects.get(username=username) except User.DoesNotExist: raise forms.ValidationError("Are you sure you are registered? We cannot find this user.") return username 参数 -

  

cmp指定两个参数(可迭代元素)的自定义比较函数,它应返回负数,零或正数

如上所示,如果两者相等,则cmp函数需要返回0;如果第一个更大则需要返回正数;如果第一个小于第二个参数,则返回负数。

但在你的情况下,你返回一个布尔值,导致问题。