2012-07-26 85 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'] 

這樣你就可以町您想要的訂單是

相關問題