<p>您已经得到了几个其他答案,但只是为了好玩,使用递归:</p>
<pre class="lang-py prettyprint-override"><code>def find_sum(s, lst):
if len(lst) <= 1: # with list of length <= 1, impossible to find a pair
return []
x, sublst = lst[0], lst[1:]
if s - x in sublst:
return [(x, s - x)] + find_sum(s, sublst)
else:
return find_sum(s, sublst)
lst = [2, 4, 5, 6, 7, 8]
print(find_sum(12, lst)) # [(4, 8), (5, 7)]
</code></pre>
<p>在每个递归步骤中,给定一个列表,我们选择head元素(命名为<code>x</code>)和列表的其余部分<code>sublst</code>。如果在<code>sublst</code>中有一个元素与<code>x</code>求和以得到给定的数字,则返回<code>x</code><em>和其他内容</em>。这是递归发生的地方;我们只考虑了<code>(x, y)</code>中<code>y</code>在<code>sublst</code>中的<code>(x, y)</code>对,而不是<code>sublst</code>中的^<em>对。所以我们需要再次调用<code>find_sum</code>,使用这个<code>sublst</code>。当给定列表的长度为1或为空时,该递归过程结束;在这些情况下,没有配对要考虑,所以只返回一个空列表。<p>
<p>注意这里的<code>else</code>是多余的,因为它前面有<code>return</code>。但我还是喜欢它在那里</p>
<hr/>
<p>以下是使用生成器的另一个版本:</p>
<pre class="lang-py prettyprint-override"><code>def find_sum(s, lst):
lst = lst.copy()
while lst:
x = lst.pop(0)
if s - x in lst:
yield x, s - x
lst = [2, 4, 5, 6, 7, 8]
print(list(find_sum(12, lst))) # [(4, 8), (5, 7)]
</code></pre>