基本上,问题出现在两个列表之间的共同元素。如果您可以区分合并共同和独特元素的情况,您将解决您的问题,即您需要创建以下笛卡尔积。
a_unique X b_unique
a_unique X b_common
a_common X b_unique
a_common X b_common
在这四种情况中,最后一种情况会导致非唯一的配对。再想一想,最后一个带有唯一配对的笛卡尔积只是从a_common中简单选择2个元素。
最后,通过创建一个集合并将两个列表放入其中,然后迭代比较来进行元素的分离。
>>> #Sample Lists
>>> a = ['C0','C1','C2','A0','A1','A2']
>>> b = ['C0','C1','C2','B0','B1','B2']
>>> from itertools import product, combinations, chain
>>> # Create sets for O(1) lookup
>>> a_key = set(a)
>>> b_key = set(b)
>>> # Segerate elements to unique and common for both lists
>>> a =
>>> b =
>>> # Create cartesian products forall the cases
>>> list(chain.from_iterable([product(a['unique'], b['unique']),
product(a['unique'], b['common']),
product(a['common'], b['unique']),
combinations(a['common'], 2)]))
[('A0', 'B0'), ('A0', 'B1'), ('A0', 'B2'), ('A1', 'B0'), ('A1', 'B1'), ('A1', 'B2'), ('A2', 'B0'), ('A2', 'B1'), ('A2', 'B2'), ('A0', 'C0'), ('A0', 'C1'), ('A0', 'C2'), ('A1', 'C0'), ('A1', 'C1'), ('A1', 'C2'), ('A2', 'C0'), ('A2', 'C1'), ('A2', 'C2'), ('C0', 'B0'), ('C0', 'B1'), ('C0', 'B2'), ('C1', 'B0'), ('C1', 'B1'), ('C1', 'B2'), ('C2', 'B0'), ('C2', 'B1'), ('C2', 'B2'), ('C0', 'C1'), ('C0', 'C2'), ('C1', 'C2')]