鱼C论坛

 找回密码
 立即注册
查看: 11658|回复: 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 编辑
a = 'easqWAwaeq'


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

print(a)
print(''.join(sorted(a, key=foo)))

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


输出
easqWAwaeq
AaaeeqqsWw

评分

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

查看全部评分

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

使用道具 举报

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

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

>>>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 | 显示全部楼层
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:
        if  new.index (k+32)>=0:
            a = new.index(k+32)
            new[a] = new[a]-32
    except ValueError:
        pass
for m in new:
    result+=str(chr(m))
print result
写的很乱

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-4-11 09:22:23 | 显示全部楼层
查看了一下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[x] = n
      dic[y] = m
  newlist = []
  for i in the_list:
    newlist.append(dic[i])
  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

评分

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

查看全部评分

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

使用道具 举报

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

使用道具 举报

发表于 2017-4-11 10:42:05 | 显示全部楼层
换个口味
import string
a = 'easqWAwaeq'
t = string.letters
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放入二维数组排序
def px(z='easqWAwaeq'):
    p=[]
    for i in z:
        if ord(i)>96 and ord(i)<123:
            p.append([ord(i)-31.5,i])
        elif ord(i)>64 and ord(i)<91:
            p.append([ord(i),i])
        else:
            p.append([ord(i)+1000,i])
    p.sort()
    x=''
    for i in p:
        x+=i[1]
    print(x)
px()

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-4-11 11:51:03 | 显示全部楼层
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[each_u] = idx
            break

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

print(a)
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可以设定排序方式真好用,之前不知道啊,写了好多,像要排序插入,心好累···
def new_sort(string):
    """输入字符串string,按字母排序,同一字母大写在前"""
    txt = sorted(string)   # 先排好序,前半是大写,后半是小写字母

    # 把大写和小写分开成两个列表
    for i in range(len(txt)):
        if txt[i].islower():
            upper = txt[:i]
            lower = txt[i:]
            break
        else:
            pass
        
    # 大写字母逐个插入到小写字母复制列表中
    out = lower.copy()
    k=0    # 控制大写字母列表指针
    
    for j in lower:
        # 看Unicode码,小写比大写字母大32
        if ord(upper[k]) <= ord(j) - 32:
            out.insert(lower.index(j)+k, upper[k]) # 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)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 18:55:09 | 显示全部楼层
我欲封天 发表于 2017-4-15 12:28
str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)
sorted(sorted(str1), key = str.upper)
这句里面的 key = str.upper 意思是
所有输入全部当成大写处理
就是按字母变成大写后的 Unicode 码排序
你得到的这个结果应该是随机的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-8 21:19:51 | 显示全部楼层
写了一个比较死板的,强制实现
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))

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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