<p>向前看可能会很混乱,尤其是在边缘条件下。如果列表为零或者最后一个元素不是元音,并且<code>list[i + 1]</code>从列表的末尾消失了怎么办?另一个选择是在运行时跟踪状态</p>
<pre><code>sample = ['b', 'e', 'a', 'a', 'e']
def accenting(sample_list):
vowel_changes = {
"a": "á",
"e": "é",
}
was_unaccented_vowel = False
for i, c in enumerate(sample_list):
if c in vowel_changes:
if was_unaccented_vowel:
sample_list[i] = vowel_changes[c]
was_unaccented_vowel = False
else:
was_unaccented_vowel = True
else:
was_unaccented_vowel = False
return sample_list
print(accenting(sample))
</code></pre>
<p>该代码更改了原始示例列表。您可以使用<code>yield</code>语句将其转换为生成器,并创建一个新副本</p>
<pre><code>sample = ['b', 'e', 'a', 'a', 'e']
def accenting(sample_list):
vowel_changes = {
"a": "á",
"e": "é",
}
was_unaccented_vowel = False
for c in sample_list:
if c in vowel_changes:
if was_unaccented_vowel:
c = vowel_changes[c]
was_unaccented_vowel = False
else:
was_unaccented_vowel = True
else:
was_unaccented_vowel = False
yield c
print(list(accenting(sample)))
</code></pre>
<p>我还摆弄着一台状态机,尽管我很难宣称它更好</p>
<pre><code>sample = ['b', 'e', 'a', 'a', 'e']
vowel_changes = {
"a": "á",
"e": "é",
}
def _state_no_accent_check(c):
if c in vowel_changes:
return _state_accent_check, c
else:
return _state_no_accent_check, c
def _state_accent_check(c):
return _state_no_accent_check, vowel_changes.get(c, c)
def accenting(sample_list):
state = _state_no_accent_check
for c in sample_list:
state, c = state(c)
yield c
print(list(accenting(sample)))
</code></pre>