Python:如何对字符串中的字母进行排序按字母顺序排列大写字母和小写字母之间的区别

问题描述:

我试图以特定的方式排列字符串的单词:在我的代码下面的输出是“MNWdeorwy”但我会喜欢它是“deMNorWwy”(所以我需要保持字母顺序,尽管是上层o lowercases) 你能帮我理解我错在哪里,为什么?谢谢Python:如何对字符串中的字母进行排序按字母顺序排列大写字母和小写字母之间的区别

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) 

我想精确,我的问题是,从以下不同:How to sort the letters in a string alphabetically in Python:事实上,在给出的链接答案不考虑串上,小写字母的区别。

+2

它不是一个重复的,因为这个问题不考虑上和小写之间的区别。 –

+0

对不起,也许是我的错,但我试图使用该答案中的所有代码对字符串“MyNewWord”进行排序,并试图获得输出“deMNorWwy”,但没有运气:您能告诉我在该答案中提供了哪一段代码给我输出,我正在寻找?谢谢 –

+0

道歉 - 我认为它列出了所有的可能性,但你的要求不在其中。抱歉! (不过要提到前面的问题。) – usr2564301

sorted()根据每个字符的序数排序。大写字母的序号低于全部小写字母。如果你想不同的行为,你需要定义自己的密钥:

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 = "".join(c)

+0

谢谢你zondo,但我试图用d =“”.join(c)改变d =''.join(sorted(c)),但输出是相同的“MNWdeorwy”。 –

+0

只有当你使用你的代码对'c',对吗?我的代码在我的电脑上效果很好。 – zondo

+0

这对我很有帮助。但是,你能解释一下为什么你指定key = lambda c:(c.lower,c.islower())? – codeAligned

您也可以尝试这样

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' 

OR

您可以与第三方库做这个PyPI上称为natsort

https://pypi.python.org/pypi/natsort

如果我理解正确的话你的要求,你想在不改变字母的大小写排序字符串

  1. 好像所有的字母有相同的情况下

这可能是实现,例如,

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]: