我正在尝试创建一个将字符串作为输入的函数。然后它将字符串中的大写字母移到前面,并将小写字母大写。小写字母和空格应保持在相对于它们在原始字符串中的相同位置。
例如:
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()
。 如果可能的话,我想修改此函数以使用不导入的单个列表理解。 如果输入都是小写的,我还想包含一个解决错误的断言语句,但我不确定该怎么做。
最佳答案
这是一个使用单个列表推导式而不导入的解决方案。与具有更高时间复杂度 O(n log n) 的排序解决方案不同,它与字符串的长度在时间上也是线性的。它还有一个断言语句标记没有大写字母的字符串(即,所有字母字符都是小写字母)。
def unravel_message(s):
assert any('A' <= c <= 'Z' for c in s)
return (duo := list(map(lambda x: ''.join(x).replace(chr(0), ''), zip(*[(c, chr(0)) if c.isupper() else (chr(0), c.upper()) for c in s]))))[0] + duo[1]
x = unravel_message(' neHAw moPPnthY')
print(x)
x = unravel_message(' no uppercase letters')
输出:
HAPPY NEW MONTH
Traceback (most recent call last):
File "C:\python\test.py", line 7, in <module>
x = unravel_message(' no uppercase letters')
File "C:\python\test.py", line 2, in unravel_message
assert any('A' <= c <= 'Z' for c in s)
AssertionError
请注意,该解决方案使用海象运算符 :=
使其成为单行代码。如果您使用的是 Python 3.8 之前的版本,则可以改为这样做:
def unravel_message(s):
assert any('A' <= c <= 'Z' for c in s)
duo = list(map(lambda x: ''.join(x).replace(chr(0), ''), zip(*[(c, chr(0)) if c.isupper() else (chr(0), c.upper()) for c in s])))
return duo[0] + duo[1]
关于python - 将大写字母移动到字符串前面并将小写字母大写的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71918801/