Python:每日一题 25(答题领鱼币)
一个字符串仅包含大小写字母,现在要将其排序成一个新的字符串,次序为从a到z,且相同的大写和小写字母排在一起,大写在小写前。如原字符串为'easqWAwaeq',排序后为'AaaeeqqsWw'
感谢@冬雪雪冬 提供题目{:10_278:}
欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner
{:10_298:} 点我上车{:10_298:}
{:10_248:} 帅的人都上车了,而丑的人还在犹豫{:10_248:}
本帖最后由 ooxx7788 于 2017-4-10 21:06 编辑
a = 'easqWAwaeq'
def foo(s):
return ord(s.lower()) * 2 + s.islower()
print(a)
print(''.join(sorted(a, key=foo)))
其实我最初的想法,直接把26个字母按照大小写间隔写一遍,编成字典,直接把字母变成值排序,再变回来就可以了。
输出
easqWAwaeq
AaaeeqqsWw 我写了一个函数可以按照要求排序,
我主要是对于字典的排序有点不清楚,所有整个过程的转换有点啰嗦,但是能搞定
def getnew(test):
# 建立一个字典来给字母编号
dic = {}
for x,y,n,m in zip(list("abcdefghijklmnopqrstuvwxyz"),list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),range(2,54,2),range(1,53,2)):
dic = n
dic = m
# 建立一个字典给数字编字母,跟第一个是相反的,为了后面替换回来字母
dic2 = {}
for each in dic:
dic2)] = each
# 把字符串变成列表然后把字母替换成数字后按照小到大排序
list1 = list(test)
list2 = []
for i in list1:
h = i.replace(i,str(dic))
list2.append(int(h))
list2.sort()
# 把排完序号的新的列表中数字替换回之前的字母
newlist = []
for k in list(map(str,list2)):
kk = k.replace(k,dic2)
newlist.append(kk)
# 把列表变成字符串返回
newstr = "".join(newlist)
return newstr
来试试一个复杂点的
test = "easqWAwaeqshfohoahoFHAOJFAOJFAJhaofhaofoajFAOUFOAUQ"
print(getnew(test))
>>>AAAAAAaaaaaaeeFFFFFfffHhhhhhJJJjOOOOooooooQqqssUUWw ooxx7788 发表于 2017-4-10 21:02
其实我最初的想法,直接把26个字母按照大小写间隔写一遍,编成字典,直接把字母变成值排序,再变回来就 ...
我的方法就是你说的这样的,不过你写的这个涉及到的这个ord函数我不知道,所以你这种方法我写不了 s = []
new = []
result = ''
num = 'easqWAwaeq'
num = list(num)
for i in num:
s.append(ord(i))
s.sort()
for j in s:
if 65<=j<=90:
j+=32
new.append(j)
new.sort()
for k in s:
try:
ifnew.index (k+32)>=0:
a = new.index(k+32)
new = new-32
except ValueError:
pass
for m in new:
result+=str(chr(m))
print result
写的很乱{:9_238:} 查看了一下sorted()函数的用法,重新写了一个排序的方法,这个更好
def foo(the_list):
dic = {}
for x,y,n,m in zip(list("abcdefghijklmnopqrstuvwxyz"),list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),range(2,54,2),range(1,53,2)):
dic = n
dic = m
newlist = []
for i in the_list:
newlist.append(dic)
return newlist
def test(the_str):
h = list(the_str)
k = sorted(h,key=foo)
new_str = "".join(k)
print(new_str)
return new_str
the_str = "fahofhoahoajghoweuofowrAOHOFNQEWOQVNOVHOWEOQHF"
test(the_str)
>>>AaaaEEeFFfffgHHHhhhhjNNOOOOOOooooooQQQruVVWWww 我写的,与 @ooxx7788 类似。
str1 = 'easqWAwaeq'
str2 = ''.join(sorted(list(str1), key = lambda x: ord(x) if ord(x) < 97 else ord(x) -31.5))
print(str2)
换个口味{:5_109:}
import string
a = 'easqWAwaeq'
t = string.letters
print ''.join(sorted(list(a), key = lambda x: )) ord放入二维数组排序
def px(z='easqWAwaeq'):
p=[]
for i in z:
if ord(i)>96 and ord(i)<123:
p.append()
elif ord(i)>64 and ord(i)<91:
p.append()
else:
p.append()
p.sort()
x=''
for i in p:
x+=i
print(x)
px() a = 'easqWAwaeq'
lower = []
upper = []
upper_pos = {}
for each in a:
if each.islower():
lower.append(each)
else:
upper.append(each)
lower = sorted(lower)
for each_u in upper:
for each_l in lower:
if each_u.lower() <= each_l:
idx = lower.index(each_l)
upper_pos = idx
break
for each_u in upper_pos.keys():
lower.insert(upper_pos, each_u)
print(a)
print(''.join(lower))
我的方法是先将大小写字符单独存放在列表里,把小写字母的列表排序,然后用大写字母的列表逐一与排序后的小写字母进行比大小,并记录下位置,放在字典里,最后把字典按位置插入到排序后的小写字母列表里即可。 求鱼币
学习了 对不起,大佬们,没鱼币了... 冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。
还真没用过sorted的key值,这样简洁多了,毕竟非字母的排序不影响这个-31.5的方法得到结果 sorted和sort都有key参数,结合lambda可以使程序大幅简化。 冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。
能解释一下 为啥-31.5 吗??不懂~~ str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)
结果:['A', 'a', 'a', 'e', 'e', 'q', 'q', 's', 'W', 'w']{:10_247:}
不得不说这也行。。。。。。{:10_247:} sorted可以设定排序方式真好用,之前不知道啊,写了好多,像要排序插入,心好累···
def new_sort(string):
"""输入字符串string,按字母排序,同一字母大写在前"""
txt = sorted(string) # 先排好序,前半是大写,后半是小写字母
# 把大写和小写分开成两个列表
for i in range(len(txt)):
if txt.islower():
upper = txt[:i]
lower = txt
break
else:
pass
# 大写字母逐个插入到小写字母复制列表中
out = lower.copy()
k=0 # 控制大写字母列表指针
for j in lower:
# 看Unicode码,小写比大写字母大32
if ord(upper) <= ord(j) - 32:
out.insert(lower.index(j)+k, upper) # k值也表示已插入字母个数
k += 1
else:
pass
# 输出字符串
return ''.join(out)
#默写一遍版主的key方法,权当是学习了
a = 'easqWAwaeq'
print(''.join(sorted(a, key=lambda x: ord(x) if ord(x)<97 else ord(x)-31.5)))
我欲封天 发表于 2017-4-15 12:28
str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)
sorted(sorted(str1), key = str.upper)
这句里面的 key = str.upper 意思是
所有输入全部当成大写处理
就是按字母变成大写后的 Unicode 码排序
你得到的这个结果应该是随机的 写了一个比较死板的,强制实现{:10_258:}
a='easqWAwaeq'
b = list(a)
L = []
L1 = []
result = ''
for i in b:
if i.isupper()==False:
L.append(i)
L.sort()
else:
L1.append(i)
for each in L1:
if each.lower() in L:
n = L.index(each.lower())
L.insert(n,each)
print(''.join(L))