2012-07-26 37 views
2

我有3个表:合并列表,使有每个元素的各个元素的总和一个列表

['1','2'] 

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

['X','Y'] 

,结果我找得到:

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

是有快速设置它的方法?

+1

[在Python中获取一系列列表的笛卡尔积]的可能副本(http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series -py-lists-in-python) – 2012-07-26 18:55:34

+0

我相信这个操作被称为集合的笛卡尔积。费利克斯是一个忍者。 – Wug 2012-07-26 18:55:43

回答

10

您可以使用itertools.product()

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

结果将按照与指定的OP不同的顺序进行。 (当然这可能并不重要。) – millimoose 2012-07-26 18:55:45

+0

@millimoose怀疑命令是重要的 - 如果是这样,它将被指定! – 2012-07-26 19:05:57

+0

非常感谢你的回复。我是python和这个论坛的新手。订单实际上很重要。但是我已经从这里发布的内容中学到了很多东西,所以我很欣赏这个答案。 – user1555609 2012-07-26 19:40:12

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()通话将在每次迭代执行)

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'] 

这样你就可以町您想要的订单是

相关问题