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