将大写字母移动到字符串前面并将小写字母大写的函数?

原文标题function that moves capitals to the front of a string and capitalizes lowercase letters?

我正在尝试制作一个将字符串作为输入的函数。然后它将字符串中的大写字母移到前面,并将小写字母大写。相对于它们在原始字符串中的位置,小写字母和空格应保持在相同的位置。

例如:

unravel_message(' neHAw moPPnthY')

应该返回'HAPPY NEW MONTH'作为输出。

unravel_message('ALL CAPITALS')

应该返回'ALLCAPITALS '作为输出。(空格保持在同一位置;只有大写字母向后移动)

我的尝试:

def unravel_message(word):
    return ''.join([i for i in word if i == i.upper()]) + ''.join([i.upper() for i in word if i == i.lower()])

对于我的函数,unravel_message(' neHAw moPPnthY')输出' HA PPY NEW MONTH'。这不太正确。我认为这可能是因为''.join()。如果可能的话,我想修改此函数以使用单个列表理解而不使用导入。如果输入都是小写的,我还想包含一个解决错误的断言语句,但我不确定如何执行此操作。

原文链接:https://stackoverflow.com//questions/71918801/function-that-moves-capitals-to-the-front-of-a-string-and-capitalizes-lowercase

回复

我来回复
  • Mad Physicist的头像
    Mad Physicist 评论

    Timsort 是稳定的,这意味着你可以用类似的东西得到你想要的东西

    >>> ''.join(sorted(message, key=lambda c: not c.isupper())).upper()
    'HAPPY NEW MONTH'
    

    诀窍是布尔值是python中整数的子类。键返回False == 0表示要移动到开头的元素,True == 1表示保留的元素。您需要使用lambda c: not c.isupper(),因为如果您使用str.islower作为键,空格和其他字符会向后移动。

    2年前 0条评论