Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 排序列表,使字母位于任何位置的数字之前_Python_List_Sorting - Fatal编程技术网

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])
从您的解决方案中进行排序。很好的解决方案,谢谢!