<p>使用<code>str.join()</code>用分隔符连接字符串序列。如果对除最后一个单词之外的所有单词<em>都这样做,则可以在此处插入<code>' and '</code>:</p>
<pre><code>def list_thing(words):
if len(words) == 1:
return words[0]
return '{}, and {}'.format(', '.join(words[:-1]), words[-1])
</code></pre>
<p>打破这个:</p>
<ul>
<li><p><code>words[-1]</code>获取列表的最后一个元素。<code>words[:-1]</code><em>对列表进行切片,以生成一个新列表,其中除最后一个单词</em>外,所有单词均为<em>。</p></li>
<li><p><code>', '.join()</code>生成一个新字符串,将<code>str.join()</code>的所有参数字符串与<code>', '</code>连接。如果输入列表中只有<em>一个</em>元素,则返回该元素,不连接。</p></li>
<li><p><code>'{}, and {}'.format()</code>将逗号连接的单词和最后一个单词插入模板(用牛津逗号完成)。</p></li>
</ul>
<p>如果传入一个空列表,上面的函数将引发一个<code>IndexError</code>异常;如果您认为空列表是该函数的有效用例,则可以在函数中专门测试该情况。</p>
<p>所以上面用<code>', '</code>将除最后一个</em>之外的所有单词连接起来,然后用<code>' and '</code>将最后一个单词添加到结果中。</p>
<p>请注意,如果只有一个单词,则得到该单词;在这种情况下没有可连接的词。如果有两个,则得到<code>'word1 and word 2'</code>。更多的单词产生<code>'word1, word2, ... and lastword'</code>。</p>
<p>演示:</p>
<pre><code>>>> def list_thing(words):
... if len(words) == 1:
... return words[0]
... return '{}, and {}'.format(', '.join(words[:-1]), words[-1])
...
>>> spam = ['apples', 'bananas', 'tofu', 'cats']
>>> list_thing(spam[:1])
'apples'
>>> list_thing(spam[:2])
'apples, and bananas'
>>> list_thing(spam[:3])
'apples, bananas, and tofu'
>>> list_thing(spam)
'apples, bananas, tofu, and cats'
</code></pre>