Python 2-根据字符串的长度和字母顺序对字符串进行排序

Python 2-根据字符串的长度和字母顺序对字符串进行排序,python,string,list,python-2.7,sorting,Python,String,List,Python 2.7,Sorting,我有一个字符串列表,我必须按降序排序并返回,但我的代码不起作用。你能帮忙吗 lst1 = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi' def lineup_students(string): lst = string.split(' ') return sorted(lst, key = len, reverse = True) print lineup_students(l

我有一个字符串列表,我必须按降序排序并返回,但我的代码不起作用。你能帮忙吗

lst1 = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi'

def lineup_students(string):
    lst = string.split(' ')
    return sorted(lst, key = len, reverse = True)

print lineup_students(lst1)
我的输出:

['Takahiro', 'Takayuki', 'Takehiko', 'Tadashi', 'Takashi', 'Takeshi', 'Takeshi', 'Takao', 'Takeo']
预期产出:

['Takehiko','Takayuki','Takahiro','Takeshi', 'Takeshi', 'Takashi','Tadashi','Takeo','Takao']
这个问题不是重复的或:可悲的是,第一个或第二个问题都没有帮助我解决我的问题(但如果我遗漏了什么,请告诉我)

@Edit1:感谢Mike和tobspr为我提供了部分解决方案:

def lineup_students(string):
    lst = string.split(' ')
    return sorted(lst, key=lambda x: (len(x), x), reverse=True)

def lineup_students(string):
    lst = string.split(' ')
    lst.sort(reverse=True)
    lst.sort(key=len, reverse=True)
    return lst
关键是代码似乎不适用于此名称列表:

['Shigekazu', 'Takeshi', 'Senichi', 'Ryuichi', 'Yoshio', 'Toshio', 'Noboru',
 'Mitsuo', 'Rafu', ''] 
应该相等

['Shigekazu', 'Takeshi', 'Senichi', 'Ryuichi', 'Yoshio', 'Toshio', 'Noboru',
 'Mitsuo', 'Rafu']
@edit2:这个答案似乎有效:

def lineup_students(s):
    return sorted(s.split(), key=lambda i:(len(i),i), reverse=True)

您的预期输出似乎期望它们以相反的顺序排序,即, 首先按字母降序排列,然后按长度降序排列:

>>> names = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi'.split()
>>> names.sort(reverse=True)
>>> names.sort(key=len, reverse=True)
>>> names
['Takehiko', 'Takayuki', 'Takahiro', 'Takeshi', 'Takeshi', 'Takashi', 'Tadashi', 'Takeo', 'Takao']
这给了我你预期的结果

您的函数如下所示:

def lineup_students(string):
    lst = string.split(' ')
    lst.sort(reverse=True)
    return sorted(lst, key=len, reverse=True)

您的预期输出似乎期望它们以相反的顺序排序,即, 首先按字母降序排列,然后按长度降序排列:

>>> names = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi'.split()
>>> names.sort(reverse=True)
>>> names.sort(key=len, reverse=True)
>>> names
['Takehiko', 'Takayuki', 'Takahiro', 'Takeshi', 'Takeshi', 'Takashi', 'Tadashi', 'Takeo', 'Takao']
这给了我你预期的结果

您的函数如下所示:

def lineup_students(string):
    lst = string.split(' ')
    lst.sort(reverse=True)
    return sorted(lst, key=len, reverse=True)
原版 您可以按长度和值进行排序:

lst1 = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi'

def lineup_students(string):
    lst = string.split(' ')
    return sorted(lst, key=lambda x: (len(x), x), reverse=True)

>>> lineup_students(lst1)
['Takehiko',
 'Takayuki',
 'Takahiro',
 'Takeshi',
 'Takeshi',
 'Takashi',
 'Tadashi',
 'Takeo',
 'Takao']
键函数首先按长度排序。如果两个单词长度相同,则使用 以单词本身为标准,即按两个相同长度单词的字母顺序排列

编辑后的版本 试试看:

>>> lineup_students(data) == res
True
原版 您可以按长度和值进行排序:

lst1 = 'Tadashi Takahiro Takao Takashi Takayuki Takehiko Takeo Takeshi Takeshi'

def lineup_students(string):
    lst = string.split(' ')
    return sorted(lst, key=lambda x: (len(x), x), reverse=True)

>>> lineup_students(lst1)
['Takehiko',
 'Takayuki',
 'Takahiro',
 'Takeshi',
 'Takeshi',
 'Takashi',
 'Tadashi',
 'Takeo',
 'Takao']
键函数首先按长度排序。如果两个单词长度相同,则使用 以单词本身为标准,即按两个相同长度单词的字母顺序排列

编辑后的版本 试试看:

>>> lineup_students(data) == res
True


你链接的问题的答案有什么问题吗?先尝试alpha排序,然后使用reversed(sorted(lst)),如果我使用reversed(sorted(lst)),结果是我看不出你是如何得到预期的输出的。实际输出看起来很好me@mike.k你能发布代码吗?你链接的问题的答案有什么问题吗?先尝试alpha排序,然后使用reversed(sorted(lst)),如果我使用reversed(sorted(lst)),输出结果是我看不出你是如何获得预期输出的。实际输出看起来很好me@mike.k你能把密码贴出来吗?好的,它能用。谢谢!我小题大做。但是如果我用一个随机变量来改变输入呢?@MarcoGiuseppedePinto你会把这些名称作为你函数的第二个参数。只需确保在调用sort之前复制一份,或者使用Mike建议的方法确保不修改输入。非常感谢:如果我理解,我的函数应该是def lineup_students(字符串、名称),对吗?因为我尝试了Mike代码,但是我遇到了一些随机测试用例。当然,你应该删除string参数,所以你可以把名字列表作为字符串的开头。对不起,如果我解释错了。不要抱歉,我是新手,所以是我的错!好的,它起作用了……谢谢!我小题大做。但是如果我用一个随机变量来改变输入呢?@MarcoGiuseppedePinto你会把这些名称作为你函数的第二个参数。只需确保在调用sort之前复制一份,或者使用Mike建议的方法确保不修改输入。非常感谢:如果我理解,我的函数应该是def lineup_students(字符串、名称),对吗?因为我尝试了Mike代码,但是我遇到了一些随机测试用例。当然,你应该删除string参数,所以你可以把名字列表作为字符串的开头。对不起,如果我解释错了。不要抱歉,我是新手,所以是我的错!非常感谢迈克!我试着使用你的代码,但是我被一些随机测试用例卡住了(我正在编辑主要的帖子来添加它们),非常感谢Mike!我试图使用你的代码,但我被一些随机测试用例卡住了(我正在编辑主要帖子来添加它们)