迭代按重复项分组的列表的子列表的有效方法

时间:2017-04-27 01:35:58

标签: python-3.x

标题可能不清楚,但我无法想出更好的方式来表达它。 我的意思是按重复分组的#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]]

我认为上面的列表已经完成,如果不是,请指出。无论如何,我希望你知道我想做什么。提前致谢

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列表中提供的所有(任意多个)子列表的乘积