<p>这在(至少)两个功能中更容易实现:</p>
<pre><code>def process(line):
vicinals = []
non_vicinals = []
for word in line.split():
if is_vicinal(word):
vicinals.append(word)
else:
non_vicinals.append(word)
if vicinals:
print('vicinals: {}'.format(' '.join(vicinals)))
if non_vicinals:
print('Non-vicinals: {}'.format(' '.join(non_vicinals)))
def is_vicinal(word):
raise NotImplementedError()
line = input('Line: ').lower()
process(line)
</code></pre>
<p>现在我们可以开发和测试<code>is_vicinal</code>,而不必担心任何显示或输入内容。在</p>
<hr/>
<p>接下来,请注意,您只想处理唯一字符,而不关心<code>word</code>内的顺序(建议使用<code>set</code>),并且希望查看相邻字符(建议排序):</p>
^{pr2}$
<p>现在我们想<code>group</code>这些字符(<strong>我将把这个实现留给您</strong>),这样:</p>
<pre><code>>>> group(['a', 'b', 'c', 'h', 'i', 'k', 'l', 'm', 's', 't'])
[['a', 'b', 'c'], ['h', 'i'], ['k', 'l', 'm'], ['s', 't']]
</code></pre>
<p>现在我们的<code>is_vicinal</code>函数变得很简单:</p>
<pre><code>>>> def is_vicinal(word)
letters = sorted(set(word))
return all(len(l) > 1 for l in group(letters))
>>> is_vicinal("blacksmith")
True
>>> is_vicinal("tower")
False
</code></pre>
<p>现在您只需为<code>'a'</code>和<code>'z'</code>添加额外的逻辑!你可以把它放在<code>group</code>或者<code>is_vicinal</code>-实验中,看看它在哪里最适合。在</p>
<hr/>
<p>注意,至少根据<a href="http://en.wikipedia.org/wiki/Vicinal_(logology)" rel="nofollow">definition in Wikipedia</a>的说法,非邻接函数并不像<code>not is_vicinal</code>那么简单,所以您可能需要编写另一个函数<code>def is_non_vicinal(word):</code>来处理这个问题。这将非常类似于<code>is_vicinal</code>函数,并且仍然可以使用<code>group</code>(这就是为什么最好分开使用不同的函数)。在</p>
<pre><code>>>> is_non_vicinal("tower")
True
>>> is_vicinal("almanac")
False
>>> is_non_vicinal("almanac")
False
</code></pre>
<p>这还需要对<code>process</code>稍作修改。在</p>