组合列表以生成一个列表,其中每个元素都是各个元素的总和

时间:2012-07-26 18:53:17

标签: python

我有3个列表:

['1','2']

['a','b','c']

['X','Y']

以及我希望得到的结果:

['1aX','1bX','1cX','2aX','2bX','2cX','1aY','1bY','1cY','2aY','2bY','2cY']

有没有办法快速设置?

3 个答案:

答案 0 :(得分:10)

您可以使用itertools.product()

map("".join, itertools.product(list1, list2, list3))

答案 1 :(得分:2)

>>> x,y,z=['1','2'],['a','b','c'],['x','y']
>>> s=[a+b+c for c in z for a in x for b in y]
>>> s
['1ax', '1bx', '1cx', '2ax', '2bx', '2cx', '1ay', '1by', '1cy', '2ay', '2by', '2cy']

这样您可以选择所需的订单

答案 2 :(得分:1)

要获得您指定的确切结果,您可以使用以下内容:

import operator
import itertools

list1 = ['1','2']
list2 = ['a','b','c']
list3 = ['X','Y']
getter = operator.itemgetter(1, 2, 0)
result = [''.join(getter(seq)) for seq in itertools.product(list3, list1, list2)]

itertools.product()的最后一个参数将是第一个要更改的参数,因此根据您的示例输出,我们希望list2为最后一个,然后是list1,然后是list3 ,因为首先中间元素前进,然后是第一个元素,然后是最后一个元素。 operator.itemgetter()调用用于重新排序元素,以便list1中的元素首先出现,等等。

我发现列表推导更容易阅读,但这里有一个使用map()的单行替代方案:

map(''.join, map(operator.itemgetter(1, 2, 0), itertools.product(list3, list1, list2)))

(你也可以在一行中进行列表推导,但你不应该这样做,因为那时每次迭代都会执行operator.itemgetter()调用)