查找程序中元素的笛卡尔乘积 生成的动态"sub-list"



我有一个程序,它生成并修改";n〃;元素/成员,n在程序的特定运行期间保持不变。("n"的值可能在下一次运行中发生变化(。

列表中的每个成员都是一个"成员";子列表"!这些子列表元素中的每一个不仅长度可变,而且是动态的,并且在程序运行时可能会不断变化。

所以,最终,在某个给定的点上,我的列表看起来像(假设n=3(:

[['1', '2'], ['a', 'b', 'c', 'd'], ['x', 'y', 'z']]

我希望输出如下:

['1ax', '1ay', '1az', '1bx', '1by', '1bz',
'1cx', '1cy', '1cz', '1dx', '1dy', '1dz',
'2ax', '2ay', '2az', '2bx', '2by', '2bz',
'2cx', '2cy', '2cz', '2dx', '2dy', '2dz']

即具有恰好(2*3*4(个元素的列表,其中每个元素的长度恰好为3;子列表";。

最简单的是itertools.product:

from itertools import product
lst = [['1', '2'], ['a', 'b', 'c', 'd'], ['x', 'y', 'z']]
output = [''.join(p) for p in product(*lst)]
#  OR
output = list(map(''.join, product(*lst)))
# ['1ax', '1ay', '1az', '1bx', '1by', '1bz', 
#  '1cx', '1cy', '1cz', '1dx', '1dy', '1dz', 
#  '2ax', '2ay', '2az', '2bx', '2by', '2bz', 
#  '2cx', '2cy', '2cz', '2dx', '2dy', '2dz']

特定于字符串的手动实现可能如下所示:

def prod(*pools):
if pools:
*rest, pool = pools
for p in prod(*rest):
for el in pool:
yield p + el
else:
yield ""
list(prod(*lst))
# ['1ax', '1ay', '1az', '1bx', '1by', '1bz', 
#  '1cx', '1cy', '1cz', '1dx', '1dy', '1dz', 
#  '2ax', '2ay', '2az', '2bx', '2by', '2bz', 
#  '2cx', '2cy', '2cz', '2dx', '2dy', '2dz']

最新更新