Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从置换创建列表的更有效方法_Python_Python 3.x - Fatal编程技术网

Python 从置换创建列表的更有效方法

Python 从置换创建列表的更有效方法,python,python-3.x,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

我有两个不同的清单

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!。每当有人不是完美的组合时,从我的总列表中删除所有不匹配的组合


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

您想使用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) .............. 
导入itertools >>>lst1=[i代表范围内的i(40)] >>>lst2=[i代表范围内的i(41100)] >>>itertools.产品(lst1、lst2) >>>列表(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) ..............
您可以使用生成器,而不是在内存中创建整个列表。事实上,正如@joaquinlpereyra所建议的,
itertools.product
是一个生成器,但在内存中创建列表时会出现问题(即
列表(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\u generator
是一个生成器函数,
((x,y)表示a中的x表示b中的y)
是一个生成器表达式(与
[(x,y)表示a中的x表示b中的y]
相反,后者是一个列表,请参见生成器表达式指南)


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

这些不是排列,这是一个产品。你会遇到内存不足错误,因为列表大于可用内存。为什么你需要它成为一个列表?你有近4000万个列表,每个列表包含多少个元组。拖出几乎是预期的行为。因为我需要能够存储它,所以有没有存储它的方法拉取包含匹配项的组合。@Ramanaviswandha什么匹配项?您似乎还有更广阔的图景要分享。60!40*60长度列表的排列?这可能不会解决他们的内存不足错误。我相信会的,只要他不尝试将其解析为列表。我想知道是什么原因导致这样一个相对的列表出现OutOfMemory错误很小的列表。@mypetlion只是不尝试将整个产品实例化为一个列表。
product
实际上只是一个包装,类似于lst1中的
for i:lst2中的for j:yield i,j
。它只使用一个恒定的内存量,超出了
lst1
lst2
在任何时候都已经使用的内存量给定时刻。@chepner她的编辑清楚地表明,她确实计划将整个产品实例化为一个列表。“她打算”和“她需要”之间有区别;不管她如何填充,所有产品元素的列表都将是相同的大小。这听起来很像XY问题;仅仅因为问题Y可以通过创建产品元素列表来解决并不意味着这是唯一的解决方法。因此我创建了以下生成器函数。我注意到,当我不包含“不在”条件下,我可以获得实际值,但在其他情况下我返回空值。您对排除的
使用了什么参数?