两个列表之间的异构组合

时间:2015-02-18 21:04:09

标签: python

在两个列表之间生成唯一组合对的更好方法是哪些对也必须是异构的(即pair [0]!= pair [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)]

我可以使用以下内容实现目标,但似乎有点麻烦:

prod = itertools.product(a, b)
pairs = set()
for x, y in prod:
    if x != y and (y, x) not in pairs:
        pairs.add((x, y))

2 个答案:

答案 0 :(得分:5)

您可以使用frozenset代替元组,冻结集是不可变的,因此可以存储在集合中:

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

>>> pairs
set([frozenset([1, 3]), frozenset([1, 2]), frozenset([2, 3])])

你可以很容易地扩展它来存储不仅仅是成对,例如,如果我们有三元组然后检查它在集合中的所有独特组合将是麻烦的,但冷冻集使它变得容易:

>>> 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])])

答案 1 :(得分:2)

您可以使用itertools链和组合功能

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)]