【问题标题】:Removing capital letters from a python string [closed]从python字符串中删除大写字母[关闭]
【发布时间】:2018-03-14 15:00:27
【问题描述】:

我试图弄清楚如何使用 Python 从字符串中删除大写字母,但没有 for 循环。

我正在尝试在使用while 循环遍历列表时执行此操作。

那么如何删除提供的字符串中的大写字母?

【问题讨论】:

  • 删除,如将其从字符串中完全删除或用小写字母替换?
  • 为什么要使用while循环?
  • 完全删除
  • 您可以将任何 for 循环转换为 while 循环,只需手动创建一个迭代器并在每次循环时对其进行 next,或者手动创建一个 int 用于索引并在每次循环中将其递增 1。我不知道你为什么要这样做,但如果你的要求是出于某种原因“使用 while 循环”,那显然是满足该要求的方法。
  • 为什么不直接使用[''.join(c for c in s if not c.isupper()) for s in strings] 之类的推导式?即使您不能使用列表推导,该推导中的表达式也显示了一种从字符串中删除大写字母的方法。

标签: python string


【解决方案1】:

字符串是不可变的,因此您不能从字面上删除字符,但您可以创建一个跳过这些字符的新字符串。

最简单的方法是:

s = ''.join(ch for ch in s if not ch.isupper())

如果出于某种原因(例如分配要求),如果您想在没有for 的情况下执行此操作,我们可以将其写为显式循环,然后将其转换为while。所以:

result = []
for ch in s:
    if not ch.isupper(): result.append(ch)
s = ''.join(result)

要更改循环,我们必须手动设置和 next 迭代器,但使用纯 int 作为索引而不是迭代器可能更容易理解:

result = []
i = 0
while i < len(s):
    ch = s[i]
    if not ch.isupper(): result.append(ch)
    i += 1
s = ''.join(result)

当然这样更冗长,效率稍低,更容易出错,但除此之外它基本上是等价的,并且满足你的奇怪要求。

在现实生活中,可能有更好的方法来做到这一点——例如,str.translate 如果你只关心 ASCII 大写,那么使用从所有大写到 None 的映射应该很快——但我假设你的老师不想要您在这些方向上思考,他们希望您明确地考虑循环。 (当然str.translatere.sub等有一个循环,那个循环只是隐藏在你看不到的地方。)

如果您需要对列表中的多个字符串执行此操作,您可以将其包装在一个函数中,并使用推导式将其应用于列表中的每个字符串——或者您可以将其写为循环语句, 并将其转换为 while 循环,如果您愿意,以完全相同的方式。例如:

def remove_caps(s):
    result = []
    i = 0
    while i < len(s):
        ch = s[i]
        if not ch.isupper(): result.append(ch)
        i += 1
    return ''.join(result)

strings = ['aBC', 'Abc', 'abc', '']
new_strings = []
i = 0
while i < len(strings):
    new_strings.append(remove_caps(strings[i]))
    i += 1

【讨论】:

  • 更像OP老师的奇葩要求... ;)
  • @uwain12345 好吧,是的,我想 OP 唯一真正的要求是“我想满足老师的奇怪要求,所以我通过了作业”。但我认为值得指出的是,为什么在这个任务之外,你实际上想在这里使用while
  • 我会写 s = ''.join([ch for ch in s if not ch.isupper()])s = ''.join(filter(str.isupper,s))。两者都比传递给 str.join 的 gencomp 快。顺便说一句,您的引述在您的帖子中真的很奇怪。
  • 有没有办法通过拆分/加入/切片来做到这一点?
  • @Jean-FrançoisFabre 是的,将迭代器传递给 str.join 意味着它只是在 CPython 中列出了它们。但这是一个很小的恒定性能差异,可能并不重要。另外,对其进行优化依赖于了解(或至少测试)一种特定语言实现的内部结构。当它不相关时,只写最清楚的。我认为这里使用genexpr 更清楚,因为就行为而言,我们不在乎我们正在构建什么样的可迭代;如果我们使用 [],我们表示这里的性能很重要。
【解决方案2】:

你有几个选择:

1) 如果您只是想将所有大写字母转换为小写,那么.lower() 是最简单的方法。

s = 'ThiS iS A PyTHon StrinG witH SomE CAPitaL LettErs'

给予:

this is a python string with some capital letters

2)如果你想完全删除它们,那么re.sub()是一个简单的方法。

import re

print(re.sub(r'[A-Z]', '', s))

给予:

hi i  yon trin wit om ita ettrs

3)

对于字符串列表,您可以使用列表推导:

#Option1
[i.lower() for i in s])

#Option2
import re

[re.sub(r'[A-Z]', '', i) for i in s])

#Option3 (as mentioned by @JohnColeman)
[''.join([j for j in i if not j.isupper()]) for i in s]

【讨论】:

  • 有没有办法通过切片或加入字符串来做到这一点?我不允许使用上面提供的命令
  • 检查 John Coleman 的评论/答案,然后
  • 我认为一个还没有学习过 for 循环的学生除了第一个之外将无法理解这些中的任何一个 - 但无论如何展示它们非常酷,并且可能使它们 (或其他有同样问题的学生)足够好奇,比课堂教学大纲学到的更多。特别是对于一个已经在问“没有更好的方法吗?”的学生来说。并试图弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2016-12-06
  • 2020-03-20
  • 2014-04-26
相关资源
最近更新 更多