测试如果设置是其子集,考虑到组中的每个元素的数量(多重度)(Test if set is a sub

2019-07-20 23:26发布

我知道我可以测试是否设置1是SET2的一个子集:

{'a','b','c'} <= {'a','b','c','d','e'} # True

但是,下面的内容也是真实的:

{'a','a','b','c'} <= {'a','b','c','d','e'} # True

我怎么把它考虑在一组的元素出现,这样的次数:

{'a','b','c'}     <= {'a','b','c','d','e'}      # True
{'a','a','b','c'} <= {'a','b','c','d','e'}      # False since 'a' is in set1 twice but set2 only once
{'a','a','b','c'} <= {'a','a','b','c','d','e'}  # True because both sets have two 'a' elements

我知道我可以做这样的事情:

A, B, C = ['a','a','b','c'], ['a','b','c','d','e'], ['a','a','b','c','d','e']
all([A.count(i) == B.count(i) for i in A]) # False
all([A.count(i) == C.count(i) for i in A]) # True

但我不知道是否有更多的东西简洁像set(A).issubset(B,count=True)还是有办法远离列表内涵。 谢谢!

Answer 1:

作为@DSM删掉了他的解决方案,我将在此基础上可以扩大的机会,提供了一个原型

>>> class Multi_set(Counter):
    def __le__(self, rhs):
        return all(v == rhs[k] for k,v in self.items())


>>> Multi_set(['a','b','c']) <= Multi_set(['a','b','c','d','e'])
True
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','b','c','d','e'])
False
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','a','b','c','d','e'])
True
>>> 


Answer 2:

正如评论指出,一个可能的解决方案使用Counter

from collections import Counter

def issubset(X, Y):
    return len(Counter(X)-Counter(Y)) == 0


Answer 3:

简短的回答你的问题是存在着这样做,因为没有固定的操作一组定义不提供这些操作。 IE定义你正在寻找将使得数据的功能类型不是集合。

通过定义设置了具有独特的,无序的,成员:

>>> print {'a', 'a', 'b', 'c'}
set(['a', 'c', 'b'])
>>> {'a', 'a', 'b', 'c'} == {'a', 'b', 'c'}
True


Answer 4:

结合以前的答案给出了一个解决方案,它是清洁,快速地:

def issubset(X, Y):
    return all(v <= Y[k] for k, v in X.items())
  • 在@ A.Rodas版本中创建的,而不是3号实例(这两个参数必须已经是类型的计数器,因为这是处理多集的Python的方式)。
  • 早日返回(短路)只要谓词是伪造的。


文章来源: Test if set is a subset, considering the number (multiplicity) of each element in the set