两个列表之间的异构组合

CTK*_*ein 0 python

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

例如:

a = [1, 4]  
b = [1, 2, 3]  
magic_functions(a, b)  
Run Code Online (Sandbox Code Playgroud)

应该返回:

[(1, 2), (4, 2), (1, 3), (4, 1), (4, 3)]
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法到达那里,但似乎有点麻烦:

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))
Run Code Online (Sandbox Code Playgroud)

Ash*_*ary 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])])
Run Code Online (Sandbox Code Playgroud)

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

>>> 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])])
Run Code Online (Sandbox Code Playgroud)

  • @aruisdante我知道但是OP只想存储(1,2)而不是(2,1),所以`frozenset`将允许我们这样做,因为我们不能使用普通集. (2认同)