python中嵌套列表的可能组合

时间:2017-09-20 21:03:10

标签: python python-3.x list

如果我有一个列表列表,并希望从每个不同的索引中找到所有可能的组合,我该怎么办呢?

例如:

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个元素。

3 个答案:

答案 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)被排除,因为14都是列表列表中的第一个元素(来自[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]]