【问题标题】:Sorting list of strings by their length and the last N characters按长度和最后 N 个字符对字符串列表进行排序
【发布时间】:2019-01-18 10:20:06
【问题描述】:

我正在尝试解决一个问题,我必须按字符串的长度以及字符串中的最后一个字符对字符串列表进行排序。如果字符串长度相同,最后一个字符相同,则应按倒数第二个字符排序,依此类推。

我有这段代码,但我不清楚为什么它不能按我的意愿工作。有人能指出我正确的方向吗?

我的代码:

import sys

word_lists = [line.split(' ') for line in ' '.join([x.strip() for x in sys.stdin.readlines()]).split('  ')]
for i in range(0, len(word_lists)):
    word_lists[i] = sorted((word_lists[i]), key=lambda x: (x[:-1], len(x)))

输入:

apple
banana
grape
kiwi
pear

airplane
bicycle
boat
car

输出:

[['apple', 'banana', 'grape', 'kiwi', 'pear'], ['airplane', 'bicycle', 'boat', 'car']]

预期输出:

[['banana', 'apple', 'grape', 'kiwi', 'pear'], ['bicycle', 'airplane', 'car', 'boat']]

【问题讨论】:

  • 您似乎想比较反转的字符串。目前尚不清楚应该如何考虑长度(取决于您书中的“以及”的含义)。大概您需要将长度用作主键,将反向字符串用作决胜局。如果是这样,你为什么要在飞机前骑自行车?

标签: python string list sorting


【解决方案1】:

使用x[::-1]

例如:

l = [['apple', 'banana', 'grape', 'kiwi', 'pear'], ['airplane', 'bicycle', 'boat', 'car']]
for i in l:
    print(sorted(i, key=lambda x: (x[::-1], len(x))))

输出:

['banana', 'apple', 'grape', 'kiwi', 'pear']
['bicycle', 'airplane', 'car', 'boat']

output = [sorted(i, key=lambda x: (x[::-1], len(x))) for i in l]
print(output)
--> [['banana', 'apple', 'grape', 'kiwi', 'pear'], ['bicycle', 'airplane', 'car', 'boat']]

【讨论】:

  • x[::-1] 而不是x[-1] 来处理关系,而不仅仅是最后一个字符
  • 感谢您的回答。从我的角度来看,这可能是一个不好的例子。但是如果字符串具有相同的长度并且也以相同的字母结尾,这种方法似乎偶尔会给我错误的输出(我之前测试过)。假设第二个列表中的最后两个单词是'car''cer',那么car 应该在cer 之前,因为e 在a 之前。希望这是有道理的..
  • 看起来@sacul 在我写评论时写了答案。现在可以了。谢谢!
【解决方案2】:

如果您想首先对字符串的长度进行数据排序,那么您必须更改代码中的键顺序,并且您希望字符串从尾部按字母顺序排序,因此您必须从尾部发送字符 (x[::-1] ) 所以最后你必须改变你的密钥 键(len(x), x[::-1])

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2014-02-13
    • 2011-01-18
    • 2020-09-25
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2016-04-23
    • 2021-06-10
    相关资源
    最近更新 更多