我有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