Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何按字母顺序对字符串中的字母进行排序,保持大小写之间的区别_Python_String_Python 2.7_Sorting - Fatal编程技术网

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

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

我试图以一种特殊的方式对字符串中的单词进行排序:在我下面的代码中,输出是“MNWdeorwy”,但我希望它是“demnorwy”(因此,尽管字母是大写或小写,但我需要保持字母的顺序) 你能帮我理解我错在哪里以及为什么吗?多谢各位

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,因此小写版本优先。