2017-06-14 90 views
1

我想排序順序小寫字符串「sOrTiNg1234」 - >大寫 - > NUMS與拉姆達(蟒蛇)排序

我做

string = sorted(input(), key = lambda c: (c.isdigit(), c.isupper(),c.islower())) 

我不得不這樣做的鑰匙至於看起來是對的。例如,我首先想要檢查它是否是一封信,然後我想檢查它是否是小寫,然後檢查它是否是大寫。然而,完全相反似乎工作。

有人可以解釋鍵的工作與排序?

多謝

+2

'False user2357112

+0

@ user2357112這可以簡化爲「真」。 –

+0

@ user2357112啊,這很有道理。如你所說,感謝 – Flyrom

回答

1

正如簡要評論暗示,問題是,True == 1False == 0,因此True實際上是False。所以,如果你把鑰匙放在了「直觀」的順序,你會得到這樣的:

>>> s = 'sOrTiNg1234' 
>>> sorted(s, key = lambda c: (c.islower(), c.isupper(), c.isdigit())) 
['1', '2', '3', '4', 'O', 'T', 'N', 's', 'r', 'i', 'g'] 

這可能會成爲一個更清楚一點由具有看看關鍵元組:

>>> [(c, map(int, (c.islower(), c.isupper(), c.isdigit()))) for c in s] 
[('s', [1, 0, 0]), 
('O', [0, 1, 0]), 
('r', [1, 0, 0]), 
('T', [0, 1, 0]), 
('i', [1, 0, 0]), 
('N', [0, 1, 0]), 
('g', [1, 0, 0]), 
('1', [0, 0, 1]), 
('2', [0, 0, 1]), 
('3', [0, 0, 1]), 
('4', [0, 0, 1])] 

可以解決這個問題通過使用reverse參數:

>>> sorted(s, key = lambda c: (c.islower(), c.isupper(), c.isdigit()), reverse=True) 
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4'] 

或者,像你一樣,通過在關鍵的元組扭轉值:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper(), c.islower())) 
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4'] 

或者通過否定的專用密鑰(not作品,太):

sorted(s, key = lambda c: (-c.islower(), -c.isupper(), -c.isdigit())) 
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4'] 

還要注意的是使用lowerupper實際上是多餘的:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper())) 
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4'] 

如果你也想按字符本身排序,將其添加到元組的尾部:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper(), c)) 
['g', 'i', 'r', 's', 'N', 'O', 'T', '1', '2', '3', '4'] 
+0

'c.islower()'是多餘的,表達式'sorted(s,key = lambda c:(c.isdigit(),c.isupper(),c))'OK – gboffi

0

我做了什麼,是我映射的所有字母數字字符somenumbers

較小的情況下,字母從0映射到25由較小的情況下字母的ASCII值減去97 。

通過減去65(ord('A'))並將小寫字母的ascii值加上26,類似地將較大的大寫字母從26映射到51。

類似數字值由從數字字符

Afterr做所有這每個字符指向somenumber ASCII值減去48(ORD(「0」)從52映射到61​​,而且所有字符是根據排序那些numbers.And最終排序列表後,我參加了所有字符

def function(alpha) : 

    if alpha.islower(): 
     return ord(alpha)-97 #from a(0) to z(25) 
    elif alpha.isupper(): 
     return ord(alpha)-65+(26) #from A(26) to Z(51) 
    else: 
     return ord(alpha)-48+(52) #from 0(52) to 9(61) 
x="sOrTiNg1234" 

y=list(x)  

y=sorted(y,key=function) 

answer=''.join(y) 

我希望這是有道理的:)