<p>这是一个变体:</p>
<pre><code>from collections import Counter
def sum_target(lst, target):
unique_list = list(set(lst))
counts = Counter(lst)
remainders = {number: target-number for number in unique_list}
match = set()
for a, b in remainders.items():
if b in remainders:
match.add(tuple(sorted((a, b))))
# restore multiplicities:
ret = []
for a, b in match:
if a != b:
mult = counts[a] * counts[b]
ret.extend([a, b] for _ in range(mult))
ret.extend([b, a] for _ in range(mult))
# ret.append((mult, (a, b)))
# ret.append((mult, (b, a)))
else:
mult = counts[a] * (counts[a]-1)
ret.extend([a, a] for _ in range(mult))
# if mult != 0:
# ret.append((mult, (a, b)))
return ret
</code></pre>
<p>不完全确定多重性是以你想要的方式处理的(在你的例子中,它们是我得到的两倍。。。为什么<code>[5, 5]</code>有6个版本?在原始列表中有三个<code>5</code>,你只能得到3对…)</p>
<hr/>
<p>如果列表中有许多重复项,那么根据输出的长度,我建议将代码的最后一部分更改为</p>
^{pr2}$
<p>得到结果</p>
<pre><code>numbers = [1, 2, 4, 4, 4, 4, 5, 5, 5, 7, 7, 8, 8, 8, 9]
s = 10
print(sum_target(lst=numbers, target=s))
# [(3, (8, 2)), (3, (2, 8)), (6, (5, 5)), (1, (1, 9)), (1, (9, 1))]
</code></pre>