[英]how to sort alphanumeric string in python with alphabetical order comes first?
我正在處理帶有字母數字鍵的字典,我需要對它們進行排序。 所需的順序是
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
但是,到目前為止我得到的是
for key in sorted(s1.keys(),key = lambda item: (len(item),item,)):
print("%s: %s" % (key, s1[key]))
a1: 3
a2: 2
b1: 2
b2: 3
c1: 5
a1 b2: 3
a1 c1: 3
a2 b1: 2
a2 c1: 2
b1 c1: 2
b2 c1: 3
a1 b2 c1: 3
a2 b1 c1: 2
事情是我想按A-> B-> C-> AB-> AC-> BC-> ABC的順序首先按照數值對每個小組進行排序,例如AB,如果我如果有a1b1,a2b1,a1b2,a2b2,則順序為a1b1,a1b2,a2b1,a2b2。
作為一項key
功能,您可以split
和zip
鍵:
>>> s = 'a1 b2 c1'
>>> list(zip(*s.split()))
[('a', 'b', 'c'), ('1', '2', '1')]
要在ab
之前對b
進行排序,您還必須考慮段的數量。
對於您的s1
數據:
>>> sorted(s1, key=lambda s: (s.count(' '), list(zip(*s.split()))))
['a1',
'a2',
'b1',
'b2',
'c1',
'a1 b2',
'a2 b1',
'a1 c1',
'a2 c1',
'b1 c1',
'b2 c1',
'a1 b2 c1',
'a2 b1 c1']
如果每個塊可以有多個字母或數字,則可以使用re.findall
:
>>> s = "aa12 bb34 cc56"
>>> re.findall("[a-z]+", s), re.findall("\d+", s)
(['aa', 'bb', 'cc'], ['12', '34', '56'])
一種可能性是擴展您的方法並在創建排序鍵時明確划分字母和數字:
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])
產生
('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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.