Python 两个列表之间的异构组合

Python 两个列表之间的异构组合,python,Python,有什么更好的方法可以在两个列表之间生成唯一的对组合,其中对也必须是异构的,即对[0]!=对[1]?通过组合,我的意思是我只想要一份2,1和1,2。有更好的表达方式吗 例如: a = [1, 4] b = [1, 2, 3] magic_functions(a, b) 应返回: [(1, 2), (4, 2), (1, 3), (4, 1), (4, 3)] 我可以使用以下方法到达那里,但似乎有点麻烦: 产品=itertools.producta,b 成对=集合 对于产品中的x、y

有什么更好的方法可以在两个列表之间生成唯一的对组合,其中对也必须是异构的,即对[0]!=对[1]?通过组合,我的意思是我只想要一份2,1和1,2。有更好的表达方式吗

例如:

a = [1, 4]  
b = [1, 2, 3]  
magic_functions(a, b)  
应返回:

[(1, 2), (4, 2), (1, 3), (4, 1), (4, 3)]
我可以使用以下方法到达那里,但似乎有点麻烦:

产品=itertools.producta,b 成对=集合 对于产品中的x、y: 如果x!=y和y,x不是成对的: pairs.addx,y 您可以使用而不是元组,冻结集是不可变的,因此可以存储在集合中:

>>> for x, y in prod:
        if x != y:
           pairs.add(frozenset((x, y)))

>>> pairs
set([frozenset([1, 3]), frozenset([1, 2]), frozenset([2, 3])])
您可以很容易地将其扩展到存储多个对,例如,如果我们有三元组,那么在集合中检查它的所有唯一组合将很麻烦,但frozenset使其变得简单:

>>> c = [7, 8, 9]
>>> prod = itertools.product(a, b, c)
>>> triplets = set()
>>> for p in prod:
...     f = frozenset(p)
...     if len(f) == 3:
...         triplets.add(f)
...         
>>> triplets
set([frozenset([1, 3, 7]), frozenset([1, 2, 9]), frozenset([8, 1, 2]), frozenset([2, 3, 7]), frozenset([8, 1, 3]), frozenset([1, 2, 7]), frozenset([9, 2, 3]), frozenset([8, 2, 3]), frozenset([1, 3, 9])])
可以使用“链”和“组合”功能

import itertools
a = [1, 2]  
b = [1, 2, 3]  
q = set(itertools.chain(a,b))
w = list(itertools.combinations(q,2))
print w
返回

[(1, 2), (1, 3), (2, 3)]

在该特定实现中,不需要not In PAIRES检查。集合将允许添加重复值,并将重复数据消除。无需支付两次查找费用。@Aruistante他们在插入x,y时检查y,x。为什么没有2,1?正如@AshwiniChaudhary提到的,我正在检查相反的情况,以确保如果遇到例如1,0,如果0,1已经存在,我不会添加它。啊,好的,从问题陈述中不清楚1,0被认为与0,1相同,不仅仅是“in”检查中的一个输入错误。整数元组完全可以添加到集合中。@Aruistante我知道,但OP只想存储1,2,而不是2,1,所以frozenset允许我们这样做,因为我们不能使用普通集合。@Aruistante您没有抓住要点:{1,2}={2,1}对于集合是真的,因此,与其每次存储一个元组并检查其反转,为什么不使用集合呢。但是因为我们不能在集合中存储集合,所以我使用了一个冻结集。哦,我明白了,对不起,我误读了集合扩展,我把它读成了一个包含元组的冻结集,而不是一个包含2个元素的冻结集。指出不变性隐藏了这项工作的原因,这是因为set[1,2]==set[2,1]。这对我来说似乎太聪明了。你能解释一下它是如何工作的,特别是为什么工作的吗?文档解释了链和组合是如何工作的。但我首先创建一组两个列表,然后combines函数从输入返回元素的子序列。元素根据其位置而不是其值被视为唯一的。因此,如果输入元素是唯一的,则每个组合中不会有重复值。请阅读文档以了解更多方法,但本质上它利用了这样一个事实,即如果将两个列表合并为一个唯一编号列表,然后将该列表与其自身进行排列,从而形成唯一的组合,你会得到输出集。哈,我想我找到了一个反例。使用a=[1,4],b=[2,3]可以得到[…1,4…]作为输出,这不是OP想要的笛卡尔积的元素。@Jasper你知道吗,你是对的。我知道这里丢失了一些信息,但我无法确定,这是对从一个列表中的一个元素到另一个列表中的一个元素的配对的限制,而不仅仅是对两个列表中的唯一数字配对的限制。OP的示例恰好创建了这样一种情况:由于一个列表是另一个列表的子集,因此隐式满足了该限制。