你可以使用正则表达式和关键的 lambda 函数:
>>> L.sort(key=lambda s: int(re.search(r'_(\d+)',s).group(1)))
>>> L
['actor_1', 'actor_3', 'actor_5', 'actor_55', 'actor_130']
由于Python的排序是
稳定的,如果您想按照下划线左侧的字符串和右侧的数字进行排序,请对列表进行两次原地排序:
>>> L = ['actor_1', 'actor_3', 'actor_130', 'actor_55', 'voice_5', 'actor_5']
>>> L.sort()
>>> L.sort(key=lambda s: int(re.search(r'_(\d+)',s).group(1)))
>>> L
['actor_1', 'actor_3', 'actor_5', 'voice_5', 'actor_55', 'actor_130']
或者您可以通过在键函数中返回一个元组来完成相同的操作,首先按数字排序,然后按LH字符串排序:
>>> L.sort(key=lambda s: (int(re.search(r'_(\d+)',s).group(1)),s))
>>> L
['actor_1', 'actor_3', 'actor_5', 'voice_5', 'actor_55', 'actor_130']
或者:
>>> L.sort(key=lambda s: (int(s.split('_')[1]), s))
通常而言,进行两次排序比进行一次复杂的排序更快。
s
和int(n)
,变成return int(n), s
。否则 - 答案很好! - dawg