我很抱歉,如果有一个类似的问题已经得到解答,但我看了很多,并没有找到解决方案。我对Pyhton来说比较新。
我正在尝试为所有可能的列表创建索引/坐标矩阵,该列表是二维的(一组不同大小的子列表,一个列表),以便解决所有可能的元素组合。
如果我的列表是[[A, B, C]]
,则要创建的矩阵是[[0], [1], [2]]
,其中每个列表的第一个也是唯一的元素是指列表中子列表的位置。
如果我的列表是[[A, B, C], [A, B, C, D]]
,则矩阵应该产生:
[[0, 0], [0, 1], [0, 2], [0, 3],
[1, 0], [1, 1], [1, 2], [1, 3],
[2, 0], [2, 1], [2, 2], [2, 3]]
等等。每个子列表的长度等于原始列表中的子列表数。起始列表的内容是无关紧要的,但顺序是,因为在结果中,每个子列表的位置0
表示子列表中0
等元素的坐标。
基本上,这代表了子列表中元素的所有组合,类似于笛卡尔积。
我想这可以通过某种列表理解来完成,但无法找到答案。
答案 0 :(得分:4)
您正在寻找itertools.product
:
>>> import itertools
>>> lists = [['A', 'B', 'C'], ['A', 'B', 'C', 'D']]
>>> list(itertools.product(*lists))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'),
('B', 'A'), ('B', 'B'), ('B', 'C'), ('B', 'D'),
('C', 'A'), ('C', 'B'), ('C', 'C'), ('C', 'D')]
或者更确切地说,是索引的乘积,所以只需使用适当大小的ranges
而不是原始列表。
>>> list(itertools.product(*(range(len(x)) for x in lists)))
[(0, 0), (0, 1), (0, 2), (0, 3),
(1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3)]