<p>似乎你想从你的物品列表中列出所有可能的方法来执行3次弃牌,每一次由3张牌组成。我建议您对您的选择做一个更好的映射,例如<code>[3, 2, 0]</code>而不是<code>[(0,0,0),(1,0,0),(1,0,1)]</code>,其中<code>[3, 2, 0]</code>意味着为每个丢弃开始列表的索引。这种情况可以说明如下:</p>
<ul>
<li><code>[1,1,1,0,0,0,0,0,0]</code>,从<code>index=3</code>开始取出物品</li>
<li><code>[1,1,1,0,0,0]</code>,从<code>index=2</code>开始取出物品-></li>
<li><code>[1,1,0]</code>,从<code>index=0</code>开始取出物品-></li>
<li><code>[]</code></li>
</ul>
<p>解决方案的下一步是考虑所有可能的指数选择是什么样的。很明显:</p>
<ul>
<li>第一个索引不超过6(因为列表有9项)</li>
<li>第二个索引不超过3(因为列表有6个项目)</li>
<li>第三个索引是0(因为列表有0项)</li>
</ul>
<p>一般来说,我建议生成所有可能的选项,并手动放弃每个选项:</p>
<pre><code>from itertools import product
d = [1,1,1,0,0,0,0,0,0]
n = 3
starting_indices = [range(len(d)-(n-1)-n*m) for m in range(len(d)//n)]
choices = []
for idx_sequence in product(*starting_indices):
current_d = d.copy()
current_choice = []
for id in idx_sequence:
current_choice.append(current_d[id: id+n])
del current_d[id: id+n]
choices.append(current_choice)
print(choices)
</code></pre>
<h3>注:</h3>
<p>有些选择可能重复</p>
<h3>更新:</h3>
<p>如果将这些行添加到脚本中,则可以消除重复的选择:</p>
<pre><code>choices = set([tuple(tuple(m) for m in n) for n in choices]) #if you need to remove duplicates
choices = [list(list(m) for m in n) for n in choices] #if you need to set type back
</code></pre>
<h3>输出:</h3>
<pre><code>[[0, 0, 0], [1, 1, 1], [0, 0, 0]]
[[0, 0, 0], [1, 0, 0], [1, 1, 0]]
[[0, 0, 0], [1, 1, 0], [1, 0, 0]]
[[0, 0, 0], [0, 0, 0], [1, 1, 1]]
[[1, 1, 1], [0, 0, 0], [0, 0, 0]]
[[1, 0, 0], [0, 0, 0], [1, 1, 0]]
[[1, 0, 0], [1, 1, 0], [0, 0, 0]]
[[1, 1, 0], [1, 0, 0], [0, 0, 0]]
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
[[1, 1, 0], [0, 0, 0], [1, 0, 0]]
</code></pre>