【问题标题】:Sorting a list of strings with a specific method使用特定方法对字符串列表进行排序
【发布时间】:2019-05-21 23:55:57
【问题描述】:

假设我有一个这样的字符串列表

L = ['5', '3', '4', '1', '2', '2 3 5', '2 4 8', '5 22 1 37', '5 22 1 22', '5 22 1 23', ....]

我怎样才能对这个列表进行排序,这样我就会有这样的东西:

L = ['1', '2', '3','4', '5', '2 3 5', '2 4 8', '5 22 1 22', ' 5 22 1 23', '5 22 1 37', ...]

基本上我需要根据 2 个字符串之间的第一个不同数字对列表进行排序

【问题讨论】:

  • 字符串的长度真的很重要吗? '4 2' 会出现在您的结果中的什么位置,在'5' 之前还是之后?
  • 是的,长度很重要,所以 '4 2' 会在 5 之后

标签: python string list sorting


【解决方案1】:

您可以使用元组进行排序:

L = ['5', '3', '4', '1', '2', '2 3 5', '2 4 8', '5 22 1 37', '5 22 1 22', '5 22 1 23']

result = sorted(L, key=lambda x: (len(x.split()),) + tuple(map(int, x.split())))

print(result)

输出

['1', '2', '3', '4', '5', '2 3 5', '2 4 8', '5 22 1 22', '5 22 1 23', '5 22 1 37']

这个想法是使用一个元组作为键,其中第一个元素是字符串中数字的数量,其余的是数字元组。例如'2 3 5' 的键是(3, 2, 3, 5)

根据@PM2Ring 的建议,您可以使用def 函数而不是lambda

def key(x):
    numbers = tuple(map(int, x.split()))
    return (len(numbers),) + numbers

【讨论】:

  • 也许使用def 函数而不是lambda 作为键函数,这样您就不必在每个项目上调用x.split 两次。
  • 一旦 Python 3.8 出来,你可以写lambda x: (len(y:=x.split()),) + tuple(map(int, y)))。 (就个人而言,我仍然会预先定义函数,但似乎有人喜欢 PEP-572 所采用的语法。)
【解决方案2】:

与@Daniel 的方法略有不同。

idx = sorted(range(len(L)), key=lambda i: int(''.join(L[i].split())))
L = [L[i] for i in idx]

输出

['1',
 '2',
 '3',
 '4',
 '5',
 '2 3 5',
 '2 4 8',
 '5 22 1 22',
 '5 22 1 23',
 '5 22 1 37']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多