首页 > 解决方案 > 不同子列表项的可能集合,每个子列表有一个元素

问题描述

我正在寻找一种方法来获取列表中包含的所有子列表的单个元素的组合,而无需事先知道列表和子列表的长度。让我通过下面的两个例子来说明我的意思。我有两个列表(myList1myList2),并想获得两个组合集(setsCombo1setsCombo1):

myList1    = [['a'], [1, 2, 3], ['X', 'Y']]
setsCombo1 = [['a', 1, 'X'],
              ['a', 1, 'Y'],
              ['a', 2, 'X'],
              ['a', 2, 'Y'],
              ['a', 3, 'X'],
              ['a', 3, 'Y']]

myList2    = [['a'], [1, 2, 3], ['X', 'Y'], [8, 9]]
setsCombo2 = [['a', 1, 'X', 8],
              ['a', 1, 'X', 9],
              ['a', 1, 'Y', 8],
              ['a', 1, 'Y', 9],
              ['a', 2, 'X', 8],
              ['a', 2, 'X', 9],
              ['a', 2, 'Y', 8],
              ['a', 2, 'Y', 9],
              ['a', 3, 'X', 8],
              ['a', 3, 'X', 9],
              ['a', 3, 'Y', 8],
              ['a', 3, 'Y', 9]]

我对 itertools 进行了一些研究,但无法真正快速找到任何合适的东西......

标签: python

解决方案


itertools.product拆包*(几乎)这样做:

>>> from itertools import product

>>> list(product(*myList1))

[('a', 1, 'X'),
 ('a', 1, 'Y'),
 ('a', 2, 'X'),
 ('a', 2, 'Y'),
 ('a', 3, 'X'),
 ('a', 3, 'Y')]

要将内部元素转换为列表,我们map

>>> list(map(list, product(*myList1)))

[['a', 1, 'X'],
 ['a', 1, 'Y'],
 ['a', 2, 'X'],
 ['a', 2, 'Y'],
 ['a', 3, 'X'],
 ['a', 3, 'Y']]

推荐阅读