按字符串的一部分对字符串列表进行排序

29

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

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

我希望按照字母顺序对列表进行排序,基于(nameX)这一部分。我该如何做到这一点?


2
你会如何对 xxx(name2), xxx(name3), xxx(name20) 进行排序? - georg
4个回答

54

要更改排序键,请使用 key参数

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

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

2
如果您需要按数字排序,只需将其包装在int中,如下所示: s.sort(key = lambda x: int(x.split()[1])) - Elf

12
你可以使用正则表达式来解决这个问题:
>>> 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)']
请注意,上述代码将返回像name100这样的内容在name3之前,如果这不是您想要的,那么您需要执行类似以下的操作:
>>> 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)']

1
@thefourtheye 是的,我们可以。我只是觉得这样更易读。 :-) - Ashwini Chaudhary

6

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

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

编辑: test 是数组。


5
解决方案是:
sorted(b, key = lambda x: x.split()[1])

为什么?我们想要对列表(称为b)进行排序。作为一个键,我们将使用(名称X)。在这里,我们假设它总是在空格之前,因此我们将列表项分成两部分,并根据第二个部分进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接