我有一个清单。它包含x个列表,每个列表都有y个元素。我只想将每个元素与所有其他元素配对一次,(a,b= b,a)
编辑:有人批评这太vague.So了,我来描述一下它的历史。我的函数产生随机方程,并使用遗传技术,对它们进行变异和杂交,选择适合的方法。经过多次迭代后,它将返回一个包含12个对象的列表,该列表按对象的“方程”属性的适合度排序。使用'parallel python‘模块运行这个函数8次,返回一个包含8个列表的列表,每个列表包含12个对象(每个对象都有一个等式属性)。现在,在每个列表中,12个对象已经相互交叉。我希望将列表中的每个对象与所有其他列表中的所有其他对象进行交叉繁殖,但不是与它自己的列表中的对象进行交叉繁殖。(呼!)
发布于 2009-10-19 23:56:36
itertools.product是你的朋友。
关于删除重复项,请尝试使用一组集合。
现在,你想要什么就更清楚了:
import itertools
def recombinate(families):
"families is the list of 8 elements, each one with 12 individuals"
for fi, fj in itertools.combinations(families, 2):
for pair in itertools.product(fi, fj):
yield pair基本上,取所有2-族组合(并行生产的族),对于每对族,产生所有元素对。
发布于 2009-10-20 04:48:39
你还没有完全清楚你需要什么。听起来itertools应该有你需要的东西。也许您希望的是大列表中列表的itertools.product的itertools.combinations。
@fortran:你不能有一组集合。您可以拥有一组冻结集,但根据在这里拥有副本的真正含义,这可能不是所需的。
发布于 2009-10-20 00:10:19
首先,请不要将其称为“数组”。您正在使用列表列表。在Python中,数组是一种不同类型的数据结构,由数组模块提供。
此外,您的应用程序听起来像一个矩阵。如果你真的在做矩阵操作,你应该研究一下Numpy包。
乍一看,您的问题听起来像是zip()函数或itertools.izip()函数可以解决的问题。您绝对应该通读itertools模块的文档,因为它有各种列表操作,它们的运行速度比您用Python自己编写的任何东西都要快。
https://stackoverflow.com/questions/1591762
复制相似问题