我有3個表:合併列表,使有每個元素的各個元素的總和一個列表
['1','2']
['a','b','c']
['X','Y']
,結果我找得到:
['1aX','1bX','1cX','2aX','2bX','2cX','1aY','1bY','1cY','2aY','2bY','2cY']
是有快速設置它的方法?
我有3個表:合併列表,使有每個元素的各個元素的總和一個列表
['1','2']
['a','b','c']
['X','Y']
,結果我找得到:
['1aX','1bX','1cX','2aX','2bX','2cX','1aY','1bY','1cY','2aY','2bY','2cY']
是有快速設置它的方法?
您可以使用itertools.product()
:
map("".join, itertools.product(list1, list2, list3))
結果將按照與指定的OP不同的順序進行。 (當然這可能並不重要。) – millimoose 2012-07-26 18:55:45
@millimoose懷疑命令是重要的 - 如果是這樣,它將被指定! – 2012-07-26 19:05:57
非常感謝你的回覆。我是python和這個論壇的新手。訂單實際上很重要。但是我已經從這裏發佈的內容中學到了很多東西,所以我很欣賞這個答案。 – user1555609 2012-07-26 19:40:12
爲了讓您指定確切的結果,你可以使用以下命令:
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()
通話將在每次迭代執行)
>>> 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']
這樣你就可以町您想要的訂單是
[在Python中獲取一系列列表的笛卡爾積]的可能副本(http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series -py-lists-in-python) – 2012-07-26 18:55:34
我相信這個操作被稱爲集合的笛卡爾積。費利克斯是一個忍者。 – Wug 2012-07-26 18:55:43