Python:如何按字母顺序对字符串中的字母进行排序,保持大小写之间的区别
我试图以一种特殊的方式对字符串中的单词进行排序:在我下面的代码中,输出是“MNWdeorwy”,但我希望它是“demnorwy”(因此,尽管字母是大写或小写,但我需要保持字母的顺序) 你能帮我理解我错在哪里以及为什么吗?多谢各位Python:如何按字母顺序对字符串中的字母进行排序,保持大小写之间的区别,python,string,python-2.7,sorting,Python,String,Python 2.7,Sorting,我试图以一种特殊的方式对字符串中的单词进行排序:在我下面的代码中,输出是“MNWdeorwy”,但我希望它是“demnorwy”(因此,尽管字母是大写或小写,但我需要保持字母的顺序) 你能帮我理解我错在哪里以及为什么吗?多谢各位 wrd = "MyNewWord" def order_word(s): if s == "": return "Invalid String!" else: c = sorted(s) d = ''.j
wrd = "MyNewWord"
def order_word(s):
if s == "":
return "Invalid String!"
else:
c = sorted(s)
d = ''.join(sorted(c))
return d
print order_word(wrd)
我想确切地指出,我的问题与下面的不同:事实上,链接中给出的答案不考虑字符串中的上、下两种情况之间的差异。
<代码> SoReD()/Case>根据每个字符的序号排序。大写字母的序数低于所有小写字母。如果需要不同的行为,则需要定义自己的密钥:
c = sorted(s, key=lambda c: (c.lower(), c.islower()))
这样,c
将按('c',1)
排序,c
将按('c',0)
排序。两者都位于('d',…)
或('e',…)
等之前,但大写C
早于小写C
顺便说一句,你不应该说
d=”“.join(sorted(c))
,因为c
已经被排序了。只需执行d=“”。加入(c)
您也可以这样尝试
import re
def natural_sort(wrd):
convert = lambda text: int(text) if text.isdigit() else text.lower()
final = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return ''.join(sorted(wrd, key = final))
输出:
>>> natural_sort(wrd)
'deMNorwWy'
或
您可以在名为natsort的PyPI上使用第三方库来实现这一点
如果我正确理解您的要求,您希望对字符串进行排序
In [44]: a = 'zWea'
In [45]: sorted(a,key=lambda c:c.upper())
Out[45]: ['a', 'e', 'W', 'z']
In [46]:
这是因为在比较过程中可以瞬间变换单个字符
忘了提一下,您可以在字符串中混合使用非字母字符,但在大写字母字符和小写字母字符之间放置了一些字符(例如,^
插入符号),因此您得到的结果取决于使用.lower()
或.upper()
字符串方法
In [56]: sorted('abCD^',key=lambda c:c.lower())
Out[56]: ['^', 'a', 'b', 'C', 'D']
In [57]: sorted('abCD^',key=lambda c:c.upper())
Out[57]: ['a', 'b', 'C', 'D', '^']
In [58]:
它不是一个复制品,因为这个问题没有考虑上下两种情况之间的区别。对不起,Rad,也许是我的错,但是我试图用这个答案中的所有代码对字符串“MyNeWord”进行排序,并试图获得输出“DimOrWy”。不走运:你能告诉我答案中提供的哪段代码提供了我正在搜索的输出吗?谢谢,抱歉-我以为它列出了所有的可能性,但你的要求不在其中。很抱歉(很高兴提到前面的问题。)别担心:谢谢!谢谢zondo,但我尝试将d=''.join(排序(c))更改为d=“”.join(c),但输出是相同的“MNWdeorwy”。只有当您将代码用于
c
,对吗?我的代码在我的电脑上运行得很好。这对我来说非常有用。但是,您能否解释一下为什么指定key=lambda c:(c.lower,c.islower())?@user53008元组按第一项排序,然后按第二项、第三项等排序。因此,“a”将低于“B”,因为每个元组的第一项(每个字母的小写版本,即“a”和“b”比较为“a”更大。如果两个字母相同,则检查元组的第二项。例如,将“a”与“a”比较将比较('a',True)和('a',False)。由于元组的第一项是相同的,因此第二项是tiebreaker。True大于False,因此小写版本优先。