两个列表之间的异构组合



在两个列表之间生成对的唯一组合有什么更好的方法,其中对也必须是异构的(即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))

您可以使用frozenset而不是元组,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])])

你可以很容易地将其扩展到存储不仅仅是对,例如,如果我们有三元组,那么在集合中检查它的所有唯一组合会很麻烦,但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])])

您可以使用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)]

最新更新