如何在python中按字母顺序排序字符串?

2024-09-29 08:16:02 发布

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

我正在处理一本带字母数字键的字典,我需要对它们进行排序。 所需的顺序是

a1 : 3
a2 : 2
b1 : 2
b2 : 3
c1 : 5
a1 b2 : 3
a2 b1 : 2
a1 c1 : 3
a2 c1 : 2
b1 c1 : 2
b2 c1 : 3
a1 b2 c1 : 3
a2 b1 c1 : 2

但是,到目前为止我得到的是

^{pr2}$

问题是我想按照A->;B->;C->;AB->;AC->;BC->;ABC的顺序,然后根据数字值对每个小组进行排序,例如,对于AB,如果我有a1b1、a2b1、a1b2、a2b2,那么顺序将是a1b1、a1b2、a2b1、a2b2。在


Tags: gta2ab排序顺序a1字母b2
2条回答

一种可能是扩展您的方法,在创建排序键时显式地划分字母和数字:

d = {
'a1': 3,
'a2': 2,
'b1': 2,
'b2': 3,
'c1': 5,
'a1 b2': 3,
'a2 b1': 2,
'a1 c1': 3,
'a2 c1': 2,
'b1 c1': 2,
'b2 c1': 3,
'a1 b2 c1': 3,
'a2 b1 c1': 2
}

def fn(key):
    letters = key[0::3] #extract the "letter" part of the key
    idx = key[1::3] #extract the "numeric" part of the key

    #construct the composite key
    return (len(letters), letters, idx)

for key in sorted(d.keys(), key = fn):
    print(key, d[key])

生产

^{pr2}$

作为key函数,您可以split和{a1}键:

>>> s = 'a1 b2 c1'
>>> list(zip(*s.split()))
[('a', 'b', 'c'), ('1', '2', '1')]

要在a b之前对b排序,还必须考虑段的数量。在

对于您的s1数据:

^{pr2}$

如果每个块可以有多个字母或数字,则可以使用^{}

>>> s = "aa12 bb34 cc56"
>>> re.findall("[a-z]+", s), re.findall("\d+", s)
(['aa', 'bb', 'cc'], ['12', '34', '56'])

相关问题 更多 >