排序列表,使字母位于任何位置的数字之前

2024-10-02 10:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下列表:

l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']

当对同样包含数字的字符串列表使用sorted()时,数字位于字母之前,因此在本例中,它将产生:

sorted(l)
['a1', 'aa', 'ae', 'erge4', 'erge7', 'erget', 'm1', 'm2', 'me2', 'mea', 'mei']

我见过一些答案,比如this one,关于如何使字母出现在数字之前,但只针对单个数字或字母。当数字可以在字符串中的任何位置时,是否也可以使用key中的一些sorted()来实现这一点?因此,预期产出:

['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

Tags: 列表a1字母数字aasortedm1m2
3条回答

有点老套:

>>> l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
>>> sorted(l, key=lambda a: [ord(c) if ord(c) > 57 else ord(c) + 100 for c in a])
['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

可以将sorted与元组列表一起用作自定义键:

L = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
res = sorted(L, key=lambda x: [(i.isdigit(), i) for i in x])

# ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

您可以使用一个键函数来遍历给定字符串的每个字符,并将'z'前置到数字,以便按字母表排序:

l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
sorted(l, key=lambda s: ['z' + c if c.isdigit() else c for c in s])

这将返回:

['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

相关问题 更多 >

    热门问题