鱼C论坛

 找回密码
 立即注册
查看: 9035|回复: 63

[技术交流] Python:每日一题 25(答题领鱼币)

[复制链接]
发表于 2017-4-10 20:02:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个字符串仅包含大小写字母,现在要将其排序成一个新的字符串,次序为从a到z,且相同的大写和小写字母排在一起,大写在小写前。

如原字符串为'easqWAwaeq',排序后为'AaaeeqqsWw'


感谢@冬雪雪冬 提供题目



欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner
点我上车
帅的人都上车了,而丑的人还在犹豫

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-10 21:02:37 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-4-10 21:06 编辑
  1. a = 'easqWAwaeq'


  2. def foo(s):
  3.     return ord(s.lower()) * 2 + s.islower()   

  4. print(a)
  5. print(''.join(sorted(a, key=foo)))
复制代码


其实我最初的想法,直接把26个字母按照大小写间隔写一遍,编成字典,直接把字母变成值排序,再变回来就可以了。


输出
  1. easqWAwaeq
  2. AaaeeqqsWw
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
新手·ing + 5 + 5 你不是人.........

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-4-10 21:07:55 | 显示全部楼层
我写了一个函数可以按照要求排序,
我主要是对于字典的排序有点不清楚,所有整个过程的转换有点啰嗦,但是能搞定
  1. def getnew(test):
  2.     # 建立一个字典来给字母编号
  3.     dic = {}
  4.     for x,y,n,m in zip(list("abcdefghijklmnopqrstuvwxyz"),list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),range(2,54,2),range(1,53,2)):
  5.         dic[x] = n
  6.         dic[y] = m
  7.     # 建立一个字典给数字编字母,跟第一个是相反的,为了后面替换回来字母
  8.     dic2 = {}
  9.     for each in dic:
  10.         dic2[str(dic[each])] = each
  11.     # 把字符串变成列表然后把字母替换成数字后按照小到大排序
  12.     list1 = list(test)
  13.     list2 = []
  14.     for i in list1:
  15.         h = i.replace(i,str(dic[i]))
  16.         list2.append(int(h))
  17.     list2.sort()
  18.     # 把排完序号的新的列表中数字替换回之前的字母
  19.     newlist = []
  20.     for k in list(map(str,list2)):
  21.         kk = k.replace(k,dic2[k])
  22.         newlist.append(kk)
  23.     # 把列表变成字符串返回
  24.     newstr = "".join(newlist)
  25.     return newstr
复制代码


来试试一个复杂点的
  1. test = "easqWAwaeqshfohoahoFHAOJFAOJFAJhaofhaofoajFAOUFOAUQ"
  2. print(getnew(test))

  3. >>>AAAAAAaaaaaaeeFFFFFfffHhhhhhJJJjOOOOooooooQqqssUUWw
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
新手·ing + 5 + 5 666啊

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-10 21:10:30 | 显示全部楼层
ooxx7788 发表于 2017-4-10 21:02
其实我最初的想法,直接把26个字母按照大小写间隔写一遍,编成字典,直接把字母变成值排序,再变回来就 ...

我的方法就是你说的这样的,不过你写的这个涉及到的这个ord函数我不知道,所以你这种方法我写不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 22:15:35 | 显示全部楼层
  1. s = []
  2. new = []
  3. result = ''
  4. num = 'easqWAwaeq'
  5. num = list(num)
  6. for i in num:
  7.     s.append(ord(i))
  8. s.sort()
  9. for j in s:
  10.     if 65<=j<=90:
  11.         j+=32
  12.     new.append(j)
  13. new.sort()
  14. for k in s:
  15.     try:
  16.         if  new.index (k+32)>=0:
  17.             a = new.index(k+32)
  18.             new[a] = new[a]-32
  19.     except ValueError:
  20.         pass
  21. for m in new:
  22.     result+=str(chr(m))
  23. print result
复制代码

写的很乱

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
新手·ing + 5 + 5 都是大佬~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 09:22:23 | 显示全部楼层
查看了一下sorted()函数的用法,重新写了一个排序的方法,这个更好
  1. def foo(the_list):
  2.   dic = {}
  3.   for x,y,n,m in zip(list("abcdefghijklmnopqrstuvwxyz"),list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),range(2,54,2),range(1,53,2)):
  4.       dic[x] = n
  5.       dic[y] = m
  6.   newlist = []
  7.   for i in the_list:
  8.     newlist.append(dic[i])
  9.   return newlist
  10.   
  11. def test(the_str):
  12.   h = list(the_str)
  13.   k = sorted(h,key=foo)
  14.   new_str = "".join(k)
  15.   print(new_str)
  16.   return new_str

  17. the_str = "fahofhoahoajghoweuofowrAOHOFNQEWOQVNOVHOWEOQHF"
  18. test(the_str)
复制代码

  1. >>>AaaaEEeFFfffgHHHhhhhjNNOOOOOOooooooQQQruVVWWww
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 10:13:00 | 显示全部楼层
我写的,与 @ooxx7788 类似。
  1. str1 = 'easqWAwaeq'
  2. str2 = ''.join(sorted(list(str1), key = lambda x: ord(x) if ord(x) < 97 else ord(x) -31.5))
  3. print(str2)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-4-11 10:42:05 | 显示全部楼层
换个口味
  1. import string
  2. a = 'easqWAwaeq'
  3. t = string.letters
  4. print ''.join(sorted(list(a), key = lambda x: [t.index(x),t.index(x)-27][t.index(x)>=26]))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:46:10 | 显示全部楼层
ord放入二维数组排序
  1. def px(z='easqWAwaeq'):
  2.     p=[]
  3.     for i in z:
  4.         if ord(i)>96 and ord(i)<123:
  5.             p.append([ord(i)-31.5,i])
  6.         elif ord(i)>64 and ord(i)<91:
  7.             p.append([ord(i),i])
  8.         else:
  9.             p.append([ord(i)+1000,i])
  10.     p.sort()
  11.     x=''
  12.     for i in p:
  13.         x+=i[1]
  14.     print(x)
  15. px()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:51:03 | 显示全部楼层
  1. a = 'easqWAwaeq'

  2. lower = []
  3. upper = []
  4. upper_pos = {}

  5. for each in a:
  6.     if each.islower():
  7.         lower.append(each)
  8.     else:
  9.         upper.append(each)

  10. lower = sorted(lower)

  11. for each_u in upper:
  12.     for each_l in lower:
  13.         if each_u.lower() <= each_l:
  14.             idx = lower.index(each_l)
  15.             upper_pos[each_u] = idx
  16.             break

  17. for each_u in upper_pos.keys():
  18.     lower.insert(upper_pos[each_u], each_u)

  19. print(a)
  20. print(''.join(lower))
复制代码


我的方法是先将大小写字符单独存放在列表里,把小写字母的列表排序,然后用大写字母的列表逐一与排序后的小写字母进行比大小,并记录下位置,放在字典里,最后把字典按位置插入到排序后的小写字母列表里即可。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 14:26:37 | 显示全部楼层
求鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 15:21:34 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 15:54:36 | 显示全部楼层
对不起,大佬们,没鱼币了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 23:03:51 | 显示全部楼层
冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。

还真没用过sorted的key值,这样简洁多了,毕竟非字母的排序不影响这个-31.5的方法得到结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 23:06:17 | 显示全部楼层
sorted和sort都有key参数,结合lambda可以使程序大幅简化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 10:22:15 | 显示全部楼层
冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。

能解释一下 为啥-31.5 吗??不懂~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 12:28:30 | 显示全部楼层
str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)

结果:['A', 'a', 'a', 'e', 'e', 'q', 'q', 's', 'W', 'w']
不得不说这也行。。。。。。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 太简单了!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 18:50:47 | 显示全部楼层
sorted可以设定排序方式真好用,之前不知道啊,写了好多,像要排序插入,心好累···
  1. def new_sort(string):
  2.     """输入字符串string,按字母排序,同一字母大写在前"""
  3.     txt = sorted(string)   # 先排好序,前半是大写,后半是小写字母

  4.     # 把大写和小写分开成两个列表
  5.     for i in range(len(txt)):
  6.         if txt[i].islower():
  7.             upper = txt[:i]
  8.             lower = txt[i:]
  9.             break
  10.         else:
  11.             pass
  12.         
  13.     # 大写字母逐个插入到小写字母复制列表中
  14.     out = lower.copy()
  15.     k=0    # 控制大写字母列表指针
  16.    
  17.     for j in lower:
  18.         # 看Unicode码,小写比大写字母大32
  19.         if ord(upper[k]) <= ord(j) - 32:
  20.             out.insert(lower.index(j)+k, upper[k]) # k值也表示已插入字母个数
  21.             k += 1
  22.         else:
  23.             pass
  24.     # 输出字符串
  25.     return ''.join(out)
复制代码

  1. #默写一遍版主的key方法,权当是学习了
  2. a = 'easqWAwaeq'
  3. print(''.join(sorted(a, key=lambda x: ord(x) if ord(x)<97 else ord(x)-31.5)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 18:55:09 | 显示全部楼层
我欲封天 发表于 2017-4-15 12:28
str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)
  1. sorted(sorted(str1), key = str.upper)
复制代码

这句里面的 key = str.upper 意思是
所有输入全部当成大写处理
就是按字母变成大写后的 Unicode 码排序
你得到的这个结果应该是随机的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 21:19:51 | 显示全部楼层
写了一个比较死板的,强制实现
  1. a='easqWAwaeq'
  2. b = list(a)
  3. L = []
  4. L1 = []
  5. result = ''
  6. for i in b:
  7.     if i.isupper()==False:
  8.         L.append(i)
  9.         L.sort()
  10.     else:
  11.         L1.append(i)
  12. for each in L1:
  13.     if each.lower() in L:
  14.         n = L.index(each.lower())
  15.         L.insert(n,each)
  16. print(''.join(L))
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表