【问题标题】:Python 2 - sorting strings respecting the lenght of the string and the alpabetical orderPython 2 - 根据字符串的长度和字母顺序对字符串进行排序
【发布时间】:2016-04-23 18:06:24
【问题描述】:

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

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']

这个问题不是how to sort by length of string followed by alphabetical order? 或Python Sort List 的重复问题:遗憾的是,第一个问题和第二个问题都没有帮助我解决我的问题(但如果我遗漏了什么,请告诉我)

@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)

【问题讨论】:

  • 你链接的问题的答案有什么问题?
  • 先尝试 alpha-sort,然后 len
  • 如果我使用 reversed(sorted(lst)) 输出是
  • 我看不到您如何达到预期的输出。实际输出对我来说看起来不错
  • @mike.k 你能把代码贴出来吗?

标签: python string list python-2.7 sorting


【解决方案1】:

原版

可以按长度和值排序:

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']

键函数首先按长度排序。如果两个词的长度相同,则使用 以单词本身为标准,即按照长度相同的两个单词的字母顺序。

修改后的版本

data = ['Shigekazu', 'Takeshi', 'Senichi', 'Ryuichi', 'Yoshio', 'Toshio', 'Noboru', 
        'Mitsuo', 'Rafu', '']

res = ['Shigekazu', 'Takeshi', 'Senichi', 'Ryuichi', 'Yoshio', 'Toshio', 'Noboru',
       'Mitsuo', 'Rafu']

def lineup_students(lst):
    lst = [x for x in lst if x]
    return sorted(lst, key=lambda x: (len(x), x), reverse=True)

试试看:

>>> lineup_students(data) == res
True

【讨论】:

  • 非常感谢迈克!我尝试使用您的代码,但遇到了一些随机测试用例(我正在编辑主帖以添加它们)
【解决方案2】:

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

>>> 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)

【讨论】:

  • 好的,它有效..谢谢!我用鼹鼠山造了一座山。但是如果我用一个随机的输入来改变输入呢?
  • @MarcoGiuseppedePinto 您会将名称作为函数的第二个参数。只需确保在调用 sort 之前进行复制,或使用 Mike 提出的方法确保您不会修改输入。
  • 非常感谢:如果我理解了,我的函数应该是 def lineup_students(string, names) 对吧?因为我尝试了 Mike 代码,但我被一些随机测试用例卡住了
  • 您当然应该删除字符串参数,因此您可以使用名称列表而不是字符串。对不起,如果我解释错了。
  • 别抱歉,我是菜鸟所以我的错!
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2015-03-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多