在字母数字字符后排序括号?

时间:2019-05-13 23:05:53

标签: python

使用Python 3:

a = ['(', 'z', 'a', '1', '{']
a.sort()
a
['(', '1', 'a', 'z', '{']

如何对列表进行排序,以使字母数字字符位于标点符号之前:

a = ['(', 'z', 'a', '1', '{']
a.custom_sort()
a
['1', 'a', 'z', '(', '{']

(实际上,我并不关心最后两个字符的顺序。)

这似乎出奇的困难!

我了解Python会按字母顺序排序,并且我正在寻找一种人类可读的排序方式。我发现natsort,但它似乎只处理数字。

3 个答案:

答案 0 :(得分:5)

您可以为sort使用键函数,该键函数返回一个元组以测试给定字符是否为字母数字,并使用该字符的字典顺序作为辅助排序键:

a.sort(key=lambda c: (not c.isalnum(), c))

答案 1 :(得分:1)

您可以通过key函数对值进行排序以检查其值是否在string.punctuation中:

import string
punctuation = set(string.punctuation)
a = sorted(a, key=lambda x: (x in punctuation, x))
print(a)
#['1', 'a', 'z', '(', '{']

答案 2 :(得分:0)

这种方法会明确检查其是否在正确的位置:

import string
import sys

a = ['(', 'z', 'a', '1', '{']

def key(a):
    if a in string.ascii_letters or a in string.digits:
        return ord(a)
    return sys.maxsize

a.sort(key=key)

print(a)