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