<p>据我所知,有<code>3</code>种不同的方法可以做到这一点,所有这些方法都比您的方法短:</p>
<ul>
<li>使用<code>for-loop</code></li>
<li>使用<code>generator-comprehension</code></li>
<li>使用<code>regular expressions</code></li>
</ul>
<hr/>
<p>首先,使用<code>for-loop</code>。这可能是对代码最直接的改进,本质上只是将<code>5</code>行减少到<code>2</code>:</p>
<pre><code>def replace_all(text, repl):
for c in "aeiou":
text = text.replace(c, repl)
return text
</code></pre>
<hr/>
<p>您还可以使用<code>generator-comprehension</code>和<code>str.join</code>方法在一行中完成。这会更快(如果这很重要的话),因为它很复杂<code>O(n)</code>,因为我们将遍历每个字符并对其进行一次计算(第一种方法是complexity<code>O(n^5)</code>,因为Python将针对不同的替换循环五次<code>text</code>)</p>
<p>因此,这种方法很简单:</p>
<pre><code>def replace_all(text, repl):
return ''.join(repl if c in 'aeiou' else c for c in text)
</code></pre>
<hr/>
<p>最后,我们可以使用<a href="https://docs.python.org/3/library/re.html#re.sub" rel="nofollow noreferrer">^{<cd14>}</a>将集合中的所有字符<code>[aeiou]</code>替换为文本<code>repl</code>。这是最短的解决方案,我可能会推荐:</p>
<pre><code>import re
def replace_all(text, repl):
return re.sub('[aeiou]', repl, text)
</code></pre>
<hr/>
<p>正如我在开始时所说的,所有这些方法都完成了任务,因此我没有必要提供单独的测试用例,但它们确实可以工作,如本测试中所示:</p>
<pre><code>>>> replace_all('hello world', 'x')
'hxllx wxrld'
</code></pre>
<hr/>
<p><strong>更新</strong></p>
<p>我注意到了一种新方法:<code>str.translate</code></p>
<pre><code>>>> {c:'x' for c in 'aeiou'}
{'a': 'x', 'e': 'x', 'i': 'x', 'o': 'x', 'u': 'x'}
>>> 'hello world'.translate({ord(c):'x' for c in 'aeiou'})
'hxllx wxrld'
</code></pre>
<p>这种方法也是{<cd11>},因此与前两种方法一样有效</p>