是否有内置的Pythonic方法来确定一个列表是否完全包含另一个列表的内容,包括重复的条目但忽略了项目的顺序?
>>> l1 = [2, 2, 3]
>>> l2 = [2, 2]
>>> l3 = [3, 2]
>>> l4 = [2, 2, 2]
>>> l5 = [2, 5, 2]
>>> is_superset(l1, l2)
True
>>> is_superset(l1, l3)
True
>>> is_superset(l1, l4)
False
>>> is_superset(l1, l5)
False
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 10
如果没有重复,或重复没关系(也就是说,如果你l1和l3他们都是彼此的超集),你只需要使用集合.但是既然你想l1成为一个合适的超集者l3,你就是在谈论多重集合.幸运的是,Counter已经为您实现了多重集:
from collections import Counter
def is_superset(a, b):
return not Counter(b) - Counter(a)
Run Code Online (Sandbox Code Playgroud)
请注意,这-是多集合之间正确的多集差异(正如s -之间set的正确设置差异),而不是跨越dicts的元素减法.因此,如果你减去一个超级(多)集,你会得到一个空的multiset(也就是说Counter(),就像Python中的所有空集合一样,这是假的).
所以现在:
>>> is_superset(l1, l2)
True
>>> is_superset(l1, l3)
True
>>> is_superset(l1, l4)
False
>>> is_superset(l1, l5)
False
Run Code Online (Sandbox Code Playgroud)
加:
>>> is_superset(l3, l1)
False
Run Code Online (Sandbox Code Playgroud)