【问题标题】:Sort list of strings by a part of the string按字符串的一部分对字符串列表进行排序
【发布时间】:2014-02-21 06:06:13
【问题描述】:

我有一个字符串列表,格式如下:

['variable1 (name1)', 'variable2 (name2)', 'variable3 (name3)', ...]

... 我想根据(nameX) 部分按字母顺序对列表进行排序。我该怎么做呢?

【问题讨论】:

  • 你会如何排序xxx(name2), xxx(name3), xxx(name20)

标签: python string list sorting


【解决方案1】:

要更改排序键,请使用the key parameter

>>>s = ['variable1 (name3)', 'variable2 (name2)', 'variable3 (name1)']
>>> s.sort(key = lambda x: x.split()[1])
>>> s
['variable3 (name1)', 'variable2 (name2)', 'variable1 (name3)']
>>> 

sorted 的工作方式相同:

>>>s = ['variable1 (name3)', 'variable2 (name2)', 'variable3 (name1)']
>>> sorted(s)
['variable1 (name3)', 'variable2 (name2)', 'variable3 (name1)']
>>> sorted(s, key = lambda x: x.split()[1])
['variable3 (name1)', 'variable2 (name2)', 'variable1 (name3)']
>>> 

请注意,如问题中所述,这将是按字母顺序排序,因此对于 2 位组件,它不会将它们解释为数字,例如“11”将出现在“2”之前。

【讨论】:

  • 如果你需要它对数字进行排序,只需将它包装在 int 中,如下所示:s.sort(key = lambda x: int(x.split()[1]))
【解决方案2】:

您可以为此使用正则表达式:

>>> import re
>>> r = re.compile(r'\((name\d+)\)')
>>> lis = ['variable1 (name1)', 'variable3 (name3)', 'variable2 (name100)']
>>> sorted(lis, key=lambda x:r.search(x).group(1))
['variable1 (name1)', 'variable2 (name100)', 'variable3 (name3)']

请注意,上面的代码将在name3 之前返回类似name100 的内容,如果这不是您想要的,那么您需要执行以下操作:

>>> r = re.compile(r'\(name(\d+)\)')
def key_func(m):
    return int(r.search(m).group(1))

>>> sorted(lis, key=key_func)
['variable1 (name1)', 'variable3 (name3)', 'variable2 (name100)']

【讨论】:

  • @thefourtheye 是的,我们可以。这对我来说看起来更具可读性。 :-)
【解决方案3】:

解决办法是:

sorted(b, key = lambda x: x.split()[1])

为什么?我们要对列表进行排序(称为 b)。我们将使用(名称 X)作为键。这里我们假设它总是以空格开头,因此我们将列表中的项目拆分为两个并根据第二个进行排序。

【讨论】:

    【解决方案4】:

    只需使用sort方法的key参数即可:

    test.sort(key = lambda x: x.split("(")[1])
    

    编辑:test 是数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2017-11-20
      • 2018-07-02
      • 1970-01-01
      • 2012-11-10
      • 2012-11-26
      • 2014-04-15
      相关资源
      最近更新 更多