标题可能不清楚,但我无法想出更好的方式来表达它。 我的意思是按重复分组的#34;列表"为:
[2, 2, 1]
其中此列表中的每个数字表示链接到列表的第i个位置的元素的重复数。例如,上面的列表可以表示:
[0, 0, 1, 1, 2]
或
["a", "a", "b", "b", "c"]
或类似的东西。
生成/迭代此类列表的所有子列表的有效方法是什么?
作为一个例子,上面列表的迭代器应该产生(按某种顺序):
[[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [2, 0, 0], [0, 2, 0], [1, 1, 1], [2, 1, 0], [2, 0, 1], [0, 2, 1], [2, 1, 1], [2, 2, 0], [1, 2, 1], [2, 2, 1]]
我认为上面的列表已经完成,如果不是,请指出。无论如何,我希望你知道我想做什么。提前致谢
答案 0 :(得分:3)
为清楚起见,首先我们可以为每个元素的可能计数生成选项列表,然后使用笛卡尔积来获得所需的结果。
import itertools # for itertools.product
a = [2, 2, 1]
options = [list(range(x+1)) for x in a]
result = list(itertools.product(*options))
print(result)
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(0, 2, 0),
(0, 2, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1),
(1, 2, 0),
(1, 2, 1),
(2, 0, 0),
(2, 0, 1),
(2, 1, 0),
(2, 1, 1),
(2, 2, 0),
(2, 2, 1)]
请注意,*
是一个参数解包运算符,它允许itertools.product
函数获取我们在options
列表中提供的所有(任意多个)子列表的乘积