回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个元组集合:</p>
<pre><code>items = (
('a', 7),
('b', 14),
('c', 21),
('d', 14),
('e', 7),
('v', 21),
('w', 14),
('z', 7) )
</code></pre>
<p>我想找到上述元组集合的所有可能子集,这些子集将小于第一个给定数,大于第二个给定数。到目前为止,我已经使用生成器生成了一个由元组中的值组成的子集列表,但是我想从上面的元组中生成一个字母子集,这些字母值或满足条件</p>
<p>到目前为止,我掌握的代码是:</p>
<pre><code>import itertools
items = [
('a', 7),
('b', 14),
('c', 21),
('d', 14),]
def subsets(lst, target1, target2, c = []):
if sum(c) <= target1 and sum(c) >= target2:
yield list(c)
else:
for i in lst:
if sum(c+[i]) <= target1:
yield list(subsets(lst, target1, target2, c+[i]))
a = list(subsets(list(j[1] for j in items), 29, 20))
print(a)
</code></pre>
<p>我现在的输出</p>
<pre><code>[7, 7, 7],
[7, 7, 14],
[7, 7, 14],
[7, 14],
[7, 21],
[7, 14],
[14, 7],
[14, 14],
[14, 14],
[21],
[14, 7],
[14, 14],
[14, 14]
The output I would like to have:
[a,a,a]
[a,a,b]
[a,a,d]
...
</code></pre>
<p>此外,我希望避免基于元素位置的重复,这意味着['d','b']和['b','d']是相同的,一次只能出现一次。现在,我可以看到我正在生成的值列表正在重复这一点</p>