<p>使用<code>for</code>循环分别处理这两个字符:</p>
<ul>
<li>第一次通过<code>for ch in ['-', '.']:</code>循环时,<code>ch</code>被设置为<code>'-'</code>。当在<code>i</code>中找到该字符时,您将创建一个删除了<code>-</code>的新字符串,并将其附加到<code>SPACE</code>,<code>i</code>本身附加到<code>WITH_SYMBOL</code>。如果找不到字符,则附加到<code>NO_SYMBOL</code>。你知道吗</li>
<li>第二次通过循环时,<code>ch</code>被设置为<code>'.'</code>,然后再次执行相同的工作。你知道吗</li>
</ul>
<p>因此,对于每个<code>SPACE</code>和<code>WITH_SYMBOL</code>,或者对<code>NO_SYMBOL</code><em>附加两次</em>。你知道吗</p>
<p>需要延迟追加,直到处理完<code>ch</code>中的所有字符,并且只有在循环完成时才决定追加到哪里。您可以使用标志变量:</p>
<pre><code>for i in data:
altered = False
cleaned = i
for ch in ['-', '.']:
if ch in clean:
altered = True
cleaned = cleaned.replace(ch, ' ')
if altered:
SPACE.append(cleaned)
WITH_SYMBOL.append(i)
else:
NO_SYMBOL.append(i)
</code></pre>
<p>您也可以只测试<em>其中一个</em>字符是否存在,并对这两个字符使用<code>str.replace()</code>。这样做是安全的,<code>str.replace()</code>不关心要替换的字符是否根本不存在:</p>
<pre><code>if '-' in i or '.' in i:
SPACE.append(i.replace('-', ' ').replace('.', ' '))
WITH_SYMBOL.append(i)
else:
NO_SYMBOL.append(i)
</code></pre>
<p>与使用两个<code>.replace()</code>调用不同,您还可以使用<a href="https://docs.python.org/3/library/stdtypes.html#str.translate" rel="nofollow noreferrer"><em>translation table</em> passed to ^{<cd21>}</a>;如果要替换的字符数可变,则这会更快,而且更灵活。对于后一种情况,可以使用<a href="https://docs.python.org/3/library/functions.html#any" rel="nofollow noreferrer">^{<cd22>} function</a>测试字符序列:</p>
<pre><code>symbols = ['-', '.'] # can be extended later
translation_map = str.maketrans(dict.fromkeys(symbols, ' ')) # map any symbol to a space
for entry in data: # entry is a nicer name here than i
# the following loops over symbols until one is found that matches, then
# returns True. If no matching symbol is found, False is given instead.
if any(ch in entry for ch in symbols):
SPACE.append(entry.translate(translation_map))
WITH_SYMBOL.append(entry)
else:
NO_SYMBOL.append(entry)
</code></pre>