如何在数组中创建元素的所有组合?

时间:2009-10-19 23:51:01

标签: python

我有一份清单。它包含x个列表,每个列表都包含y个元素。 我想将每个元素与所有其他元素配对,只需一次,(a,b = b,a)

编辑:这被批评为过于模糊。所以我将描述历史。 我的函数产生随机方程并使用遗传技术,变异和杂交它们,选择适应性。 经过多次迭代后,它返回一个包含12个对象的列表,按其“等式”属性的适合度排序。 使用'parallel python'模块运行此函数8次,返回包含8个12个对象列表(每个对象具有方程属性)的列表。 现在,在每个列表中,12个对象已经相互交叉。 我希望将列表中的每个对象与所有其他列表中的所有其他对象进行交叉繁殖,但不要与它自己的列表中的对象进行交叉混合。 (噢!)

3 个答案:

答案 0 :(得分:7)

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个系列组合(平行生成的系列)和每对系列,产生所有元素对。

答案 1 :(得分:1)

你还没有完全清楚你需要什么。听起来像itertools应该有你需要的东西。也许你想要的是你的大列表中列表的itertools.product的itertools.combinations。

@fortran:你不能拥有一套套装。你可以拥有一套frozensets,但是根据这里有重复的真正含义,这可能不是所需要的。

答案 2 :(得分:0)

首先,请不要将其称为“阵列”。您正在使用列表列表。在Python中,数组是由数组模块提供的不同类型的数据结构。

此外,您的应用程序听起来像一个矩阵。如果你真的在进行矩阵操作,你应该调查Numpy包。

乍一看,你的问题听起来就像zip()函数会解决的问题或者itertools.izip()。你一定要仔细阅读itertools模块的文档,因为它有各种列表操作,它们的运行速度比你在Python中自己编写的任何文件都要快。