如果我有一个列表列表,并希望从每个不同的索引中找到所有可能的组合,我该怎么办呢?
例如:
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
我想找到
all_possibility = [[1, 5, 9], [1, 8, 6], [4, 2, 9], [4, 8, 3], [7, 2, 6], [7, 5, 3]]
其中
[1,5,9]:1是[1,2,3]的第1个元素,5是[4,5,6]的第2个元素,9是[7,8的第3个元素, 9]。
[1,8,6]:1是[1,2,3]的第1个元素,8是[7,8,9]的第2个元素,6是[4,5的第3个元素, 6]。
等等。
(编辑)注意:我希望结果与列表的原始元素的顺序相同。 [1,8,6]但不是[1,6,8]因为8是[7,8,9]的第2个元素。
答案 0 :(得分:2)
您正在寻找的是笛卡尔积,用Python itertools.product
:
>>> import itertools
>>> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> all_possibility = list(itertools.product(*list_of_lists))
>>> print(all_possibility)
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8),
(1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7),
(2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9),
(3, 6, 7), (3, 6, 8), (3, 6, 9)]
如果你想要基于索引而不是值的排列,可以使用itertools.combinations
来获取可能的索引,然后使用这些索引从子列表中获取相应的值,如下所示:
>>> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> length = 3
>>> all_indices = list(itertools.permutations(range(length), length))
>>> all_possibility = [[l[i] for l,i in zip(list_of_lists, indices)] for indices in all_indices]
>>> print(all_possibility)
[[1, 5, 9], [1, 6, 8], [2, 4, 9], [2, 6, 7], [3, 4, 8], [3, 5, 7]]
答案 1 :(得分:2)
我也要考虑指数。例如,
(1, 4, 7)
被排除,因为1
和4
都是列表列表中的第一个元素(来自[1, 2, 3]
和[4, 5, 6]
)。实际上(1, 4, 7)
所有这些都来自嵌套列表的第一个组件。我需要具有所有不同指数的案例。
所以你实际上只想获得输出中每个索引的“列表选择器”的可能排列,即这些是你想要得到的:
>>> list(itertools.permutations(range(3), 3))
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
一旦你有了这个,你只需要翻译到你从指定子列表访问每个索引的list_of_lists
:
>>> [[list_of_lists[k][i] for i, k in enumerate(comb)] for comb in itertools.permutations(range(3), 3)]
[[1, 5, 9], [1, 8, 6], [4, 2, 9], [4, 8, 3], [7, 2, 6], [7, 5, 3]]
答案 2 :(得分:0)
本着@Poke方法的精神,这里的元素数量不同于列表中列表的数量。 (以前,个别列表中有3个元素,列表中有3个子列表。)
home-brew
我们期望列表列表中的每个(0,1)对,或
list_of_lists = [[1, 2], [3, 4], [5, 6], [7, 8]]
代码:
all_possibility = [[1, 4], [1, 6], [1, 8], [3, 2], [3, 6], [3, 8], \
[5, 2], [5, 4], [5, 8], [7, 2], [7, 4], [7, 6]]