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

标签 python string list function list-comprehension

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

例如:

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/

相关文章:

python - 如何反转连接顺序以使用子查询与 sqlalchemy 正确连接?

python - 在 pandas.DataFrame 中过滤索引级别

c++ - 无法成功返回我通过在字符串上调用 c_str() 创建的 const char*。 (C++)

C 将存档的行转换为数组

python - 我可以覆盖 Python 列表显示吗?

python - 如何匹配两个列表并插入特定值?

java - 目录浏览器获得 NPE

python - 如何在 Tornado 路由中实现多个 URL 参数?

python - Django 从 json 对象查询 View 中的 MongoDB ObjectId

string - 使用 XE2 进行远程调试 - 显示字符串