从perumations创建列表的更有效方法

时间:2017-10-26 18:40:56

标签: python python-3.x

我有两个不同的清单。

a = ['A','B','C','D']
b = [1, 2, 3, 4]

我想要做的是根据所有可能的排列创建一个列表列表。有点像。

[[('A',1),('B',2),('C',3),('D',4)]
,[('A',1),('B',2),('C',4),('D',3)]
,[('A',1),('B',3),('C',2),('D',4)]
,[...etc..]]

我能够使用以下行完成此操作。

AllList = [list(zip(a, p)) for p in permutations(b)]

我遇到的唯一问题是当我原始列表中的元素数量是11或更多时,它实际上是疯狂的。我希望得到一个更好的方法来将我的排列添加到列表中,而不会让我出现内存错误。

这个想法是基于一个名为“你是那个人吗?”的真人游戏。在MTV上。基本上有11个女孩和11个家伙已经与生产者预先匹配。他们有10周的时间来确定他们与谁完美匹配。每周你都会检查一对夫妇是否完美匹配。

所以这背后的想法是让列表存储我所有可能的排列,在这种情况下是11!每当有人不是一个完美的配对时,从我的总列表中删除所有不匹配的组合。

目标是最终将所有夫妻完美结合。基本上从原始列表列表中删除组合,直到剩下正确的行。

2 个答案:

答案 0 :(得分:0)

您可以做的是使用生成器而不是在内存中创建整个列表。事实上,正如@joaquinlpereyra所建议的,Status code: 400, response : { "error" : { "status" : 400, "message" : "Invalid context uri" }} 是一个生成器,但是当你在内存中创建列表时会出现问题(即itertools.product)。

你可以像你这样在问题中创建一个生成器函数:

list(itertools.product(a, b)

在此示例中,def product_generator(a, b, excluded=[]): for prod in ((x,y) for x in a for y in b): # or itertools.product(a, b) if prod not in excluded: yield prod 是生成器函数,product_generator是生成器表达式(与((x,y) for x in a for y in b)相对,这是列表推导 - 请参阅PEP 289以获取指南生成器表达式。)

然后,您可以迭代生成器并对每个元组执行一些有用的操作(例如,打印或附加到文件)。

答案 1 :(得分:-1)

您想使用itertools。特别是itertools.product。

>>> import itertools
>>> lst1 = [i for i in range(40)]
>>> lst2 = [i for i in range(41, 100)]
>>> itertools.product(lst1, lst2)
<itertools.product object at 0x7feedff2fe10>
>>> list(itertools.product(lst1, lst2))
[(0, 41), (0, 42), (0, 43), (0, 44), (0, 45), (0, 46), (0, 47), (0, 48), (0, 49), (0, 50), (0, 51), (0, 52), (0, 53), (0, 54), (0, 55), (0, 56), (0, 57), (0, 58), (0, 59), (0, 60), (0, 61), (0, 62), (0, 63), (0, 64), (0, 65), (0, 66), (0, 67), (0, 68), (0, 69), (0, 70), (0, 71), (0, 72), (0, 73), (0, 74), (0, 75), (0, 76), (0, 77), (0, 78), (0, 79), (0, 80), (0, 81), (0, 82), (0, 83), (0, 84), (0, 85) ..............