(tuple)元组应用之排序【python】
题目:重新排序字符串
要求:(1)小写字母在大写字母的前面。
(2)大写字母在数字前面。
(3)奇数在偶数前面。
(4)小写字母、大写字母以及数字部分都是各自升序排列。
例如:Sorting1234–重新排序后–>ginortS1324
我看到这题时第一想法是按ASCII码排序。因为小写字母的ASCII码最大,大写字母居中,数字最小。用sorted函数的reverse=True,就可以实现最基本的,让其变成小写字母、大写字母、数字的序列。然后每部分再用升序。
因为想让代码精简一些,不想反复的排序,想通过一次排序让其成型,所以我想通过sorted的key=r_str参数指定一个排序规则:
f = lambda x: ord(x) + (ord('n') - ord(x)) * 2 - 1
F = lambda x: ord(x) + (ord('N') - ord(x)) * 2 - 1
fn = lambda x: ord(x) + (ord('5') - ord(x)) * 2 - 1
def r_str(x):
if 'a'<=x<='z':
return f(x)
elif 'A'<=x<='Z':
return F(x)
else:
return fn(x)
但这时我错了!因为这个排序规则只能翻转字母的顺序,并不能让奇数在前面偶数在后面。
又经过了各种查找,得到了让奇数在前偶数在后的排序方法,得知之前的方法以为巧妙实际很繁琐,修改后的代码:
nstr = input().strip()
fn = lambda x:(3,ord(x) % 2 == 0, x)
def r_str(x):
if 'a' <= x <= 'z':
return (1,1,x,)
elif 'A'<=x<='Z':
return (2,2,x,)
else:
return fn(x)
print(''.join(sorted(nstr, key=r_str)))
只要用一个3元组就可以实现排序的比对。因为数字在最后,所以是(3,,,),这样可以保证数字排在最后,ord(x) % 2 == 0这部分奇数返回False偶数返回True,所有奇数都会排在前面,x这部分就是让其自身比较,让1在3的前面。
感觉这种算法很有意思!留念一下