Python 排序列表,使字母位于任何位置的数字之前
假设我有以下清单:Python 排序列表,使字母位于任何位置的数字之前,python,list,sorting,Python,List,Sorting,假设我有以下清单: 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'] 我已经看到了一些答案,比如如何使
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']
我已经看到了一些答案,比如如何使字母出现在数字之前,但仅限于单个数字或字母。当数字可以位于字符串中的任何位置时,是否也可以使用排序()中的一些键?因此,预期产出:
['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
有点像黑客:
>>> 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']
您可以使用一个键函数,该函数遍历给定字符串的每个字符,并将'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']
您可以将排序的与元组列表一起用作自定义键:
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']
事实上,我忘了提到我还需要按长度排序,但我只是使用排序(l,key=lambda x:[len(x)]+[(I.isdigit(),I)for I in x])
从您的解决方案中进行排序。很好的解决方案,谢谢!