新手·ing 发表于 2017-4-10 20:02:05

Python:每日一题 25(答题领鱼币)

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

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

感谢@冬雪雪冬 提供题目{:10_278:}



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

ooxx7788 发表于 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

gopythoner 发表于 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 = 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

gopythoner 发表于 2017-4-10 21:10:30

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

我的方法就是你说的这样的,不过你写的这个涉及到的这个ord函数我不知道,所以你这种方法我写不了

小锟 发表于 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:
      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:}

gopythoner 发表于 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 = 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

冬雪雪冬 发表于 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)

lovesword 发表于 2017-4-11 10:42:05

换个口味{:5_109:}
import string
a = 'easqWAwaeq'
t = string.letters
print ''.join(sorted(list(a), key = lambda x: ))

余欲渔 发表于 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()
      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()

xuanmao 发表于 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 = idx
            break

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

print(a)
print(''.join(lower))

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

Jc嘻嘻 发表于 2017-4-11 14:26:37

求鱼币

统统统 发表于 2017-4-11 15:21:34

学习了

新手·ing 发表于 2017-4-11 15:54:36

对不起,大佬们,没鱼币了...

余欲渔 发表于 2017-4-11 23:03:51

冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。

还真没用过sorted的key值,这样简洁多了,毕竟非字母的排序不影响这个-31.5的方法得到结果

冬雪雪冬 发表于 2017-4-11 23:06:17

sorted和sort都有key参数,结合lambda可以使程序大幅简化。

流月飞星 发表于 2017-4-13 10:22:15

冬雪雪冬 发表于 2017-4-11 10:13
我写的,与 @ooxx7788 类似。

能解释一下 为啥-31.5 吗??不懂~~

我欲封天 发表于 2017-4-15 12:28:30

str1 = 'easqWAwaeq'
sorted(sorted(str1), key = str.upper)

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

solomonxian 发表于 2017-6-8 18:50:47

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)))

solomonxian 发表于 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 码排序
你得到的这个结果应该是随机的

哨子1122 发表于 2017-6-8 21:19:51

写了一个比较死板的,强制实现{: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))

页: [1] 2 3 4
查看完整版本: Python:每日一题 25(答题领鱼币)