排序列表以使字母在任何位置都位于数字之前

时间:2018-12-07 17:23:14

标签: 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']

我已经看到诸如this one之类的一些答案,它们如何使字母出现在数字之前,但仅适用于单个数字或字母。当数字可以在字符串中的任何位置时,是否也可以使用key中的某个sorted()来执行此操作?如此预期的输出:

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

3 个答案:

答案 0 :(得分:6)

您可以将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']

答案 1 :(得分:2)

您可以使用一个键函数,该键函数遍历给定字符串的每个字符,并将<form class="sisform" role="form" method="POST" href="{{ URL::to('AirborneController@create', $id) }}"> {{ csrf_field() }} {!! Form::token(); !!} <button type="submit" name="submit" value="submit" class="btn btn-success"> <i class="fas fa-plus fa-sm"></i> Create </button> </form> 附加到数字字符之前,以便它们按字母排序:

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

答案 2 :(得分:0)

一点点黑客入侵

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