我想生成将列表中的索引与“槽”相关联的组合。例如,(0, 0, 1)
表示 0 和 1 属于同一个槽,而 2 属于另一个槽。(0, 1, 1, 1)
表示 1、2、3 属于同一个槽,而 0 则单独存在。在这个例子中,0和1只是识别这些槽的方式,但不携带供我使用的信息。
最后,(0, 0, 0)
完全等同于(1, 1, 1)
为了我的目的,并且(0, 0, 1)
相当于(1, 1, 0)
.
经典的笛卡尔积产生了很多我想摆脱的重复。
这就是我得到的itertools.product
:
>>> LEN, SIZE = (3,1)
>>> list(itertools.product(range(SIZE+1), repeat=LEN))
>>>
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1)]
这就是我想要得到的:
>>> [(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1)]
对于小列表来说很容易,但我不太明白如何用更大的列表来做到这一点。你有什么建议吗?
如果不清楚,请告诉我,以便我澄清我的问题。谢谢你!
Edit:根据 Sneftel 的回答,这个函数似乎有效,但我不知道它是否真的产生了所有结果:
def test():
for p in product(range(2), repeat=3):
j=-1
good = True
for k in p:
if k> j and (k-j) > 1:
good = False
elif k >j:
j = k
if good:
yield p