我正在尝试按小写的顺序对字符串'sOrTiNg1234'进行排序 - >大写 - > nums
我做了
string = sorted(input(), key = lambda c: (c.isdigit(), c.isupper(),c.islower()))
我不得不做关键的事情。例如,我首先要检查它是否是一个字母,然后我想检查它是否是小写,然后检查它是否是大写的。然而,恰恰相反似乎有效。
有人可以解释一下这些键究竟是如何与排序的一起工作的吗?
非常感谢
答案 0 :(得分:1)
正如评论中简要暗示的那样,问题是True == 1
和False == 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']
另请注意,使用lower
和 upper
实际上是多余的:
>>> 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']
答案 1 :(得分:0)
我所做的是将所有字母数字字符映射到某些数字
较小的字母字母通过从较小的字母字母的ascii值中减去97而从0映射到25。
类似地,较大的大小写字母通过减去65(ord('A'))并从较小的字母字母的ascii值中添加26来从26映射到51。
类似的数值通过从数字字符的ascii值中减去48(ord('0')而从52映射到61
在完成所有这些后,每个角色指向一些数字。并且所有字符都根据这些数字排序。最后在对列表进行排序后,我加入了所有字符
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)
我希望它有道理:)