首页 > 解决方案 > 列表之间的组合忽略和列表中的元素并忽略对的排序

问题描述

我有两个清单:

list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]

我需要这两个列表的元素的组合(而不是排列)。我试过itertools.combinationsand itertools.product,但我没有得到我想要的。例如,('d','d')将是错误的。('a','z')也将是错误的,因为'a''z'属于同一个列表 ( list1) 并且它们都没有出现在list2. 最后,我不想要两者('d','e')('e','d')- 只想要其中一对,因为顺序无关紧要。理想的输出是:

('a','d'), ('a','e'), ('a','b'),
('z','d'), ('z','e'), ('z','b'),
('d','e'), ('d','b'), ('e','b')

编辑:通常,list2并不总是 的子集list1,但我也想处理这种情况。这两个列表也可能重叠,而不是完整的子集。

标签: pythoncombinations

解决方案


由于顺序无关紧要,您应该使用setorfrozenset用于与顺序无关的集合。

一种蛮力解决方案是使用itertools.product, 但set与列表推导结合使用以删除重复项:

from itertools import product

list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]

res = [i for i in set(map(frozenset, product(list1, list2))) if len(i) > 1]

print(res)

[frozenset({'b', 'e'}),
 frozenset({'a', 'e'}),
 frozenset({'d', 'z'}),
 frozenset({'b', 'd'}),
 frozenset({'a', 'd'}),
 frozenset({'d', 'e'}),
 frozenset({'b', 'z'}),
 frozenset({'a', 'b'}),
 frozenset({'e', 'z'})]

推荐阅读