如何从多个列表中获取所有组合?

时间:2017-05-25 08:37:58

标签: python

我不确定我的问题是否正确,但我不知道如何解释其他词。 所以我有一些像

这样的清单
a = ['11', '12']
b = ['21', '22']
c = ['31', '32']

我需要得到类似的东西:

result = [
    ['11', '21', '31'],
    ['11', '21', '32'],
    ['11', '22', '31'],
    ['11', '22', '32'],
    ['12', '21', '31'],
    ['12', '21', '32'],
    ['12', '22', '31'],
    ['12', '22', '32']
]

4 个答案:

答案 0 :(得分:3)

用户itertoolscombinations

import itertools
a = ['11', '12']
b = ['21', '22']
c = ['31', '32']
list(itertools.combinations(itertools.chain(a,b,c), 3))
[('11', '12', '21'), ('11', '12', '22'), ('11', '12', '31'), ('11', '12', '32'), ('11', '21', '22'), ('11', '21', '31'), ('11', '21', '32'), ('11', '22', '31'), ('11', '22', '32'), ('11', '31', '32'), ('12', '21', '22'), ('12', '21', '31'), ('12', '21', '32'), ('12', '22', '31'), ('12', '22', '32'), ('12', '31', '32'), ('21', '22', '31'), ('21', '22', '32'), ('21', '31', '32'), ('22', '31', '32')]

product

list(itertools.product(a,b,c))
[('11', '21', '31'), ('11', '21', '32'), ('11', '22', '31'), ('11', '22', '32'), ('12', '21', '31'), ('12', '21', '32'), ('12', '22', '31'), ('12', '22', '32')]

答案 1 :(得分:1)

您需要itertools.product 它返回输入迭代的笛卡尔积。

>>> a = ['11', '12']
>>> b = ['21', '22']
>>> c = ['31', '32']
>>>
>>> from itertools import product
>>>
>>> list(product(a,b,c))
[('11', '21', '31'), ('11', '21', '32'), ('11', '22', '31'), ('11', '22', '32'), ('12', '21', '31'), ('12', '21', '32'), ('12', '22', '31'), ('12', '22', '32')]

您可以使用列表推导将元组转换为列表:

>>> [list(i) for i in product(a,b,c)]
[['11', '21', '31'], ['11', '21', '32'], ['11', '22', '31'], ['11', '22', '32'], ['12', '21', '31'], ['12', '21', '32'], ['12', '22', '31'], ['12', '22', '32']]

答案 2 :(得分:0)

import itertools
list(itertools.product(a,b,c))

或使用numpy

import numpy
[list(x) for x in numpy.array(numpy.meshgrid(a,b,c)).T.reshape(-1,len(a))]

答案 3 :(得分:0)

import numpy as np    
np.array(np.meshgrid(a, b, c)).T.reshape(-1,3)

修改

import numpy as np 
len = 3 #combination array length
np.array(np.meshgrid(a, b, c)).T.reshape(-1,len)