Python 考虑集合中每个元素的数目(多重性),测试集合是否为子集

Python 考虑集合中每个元素的数目(多重性),测试集合是否为子集,python,set,subset,multiset,multiplicity,Python,Set,Subset,Multiset,Multiplicity,我知道我可以测试set1是否是set2的子集,包括: {'a','b','c'} <= {'a','b','c','d','e'} # True 但我想知道是否有更简洁的方法,比如set(A).issubset(B,count=True)或者一种避免列表理解的方法。谢谢 对您的问题的简短回答是,没有集操作可以执行此操作,因为不提供这些操作。IE定义您正在寻找的功能将使数据类型不是集合 根据定义,集合具有唯一、无序的成员: >>> print {'a', 'a', 'b'

我知道我可以测试set1是否是set2的子集,包括:

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

但我想知道是否有更简洁的方法,比如
set(A).issubset(B,count=True)
或者一种避免列表理解的方法。谢谢

对您的问题的简短回答是,没有集操作可以执行此操作,因为不提供这些操作。IE定义您正在寻找的功能将使数据类型不是集合

根据定义,集合具有唯一、无序的成员:

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

由于@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
>>> 
>>类多组(计数器):
def_____________(自身,右侧):
返回全部(v==rhs[k]表示k,在self.items()中返回v)
>>>多集(['a','b','c'])>>多集(['a','a','b','c'])>>多集(['a','a','b','c'])>>

如评论中所述,可能的解决方案包括:


结合前面的答案,给出一个尽可能干净、快速的解决方案:

def issubset(X, Y):
    return all(v <= Y[k] for k, v in X.items())
def发行集(X,Y):

返回全部(v对于那些对多集包含的通常概念感兴趣的人,测试多集包含的最简单方法是使用多集的交集:

from collections import Counter

def issubset(X, Y):
    return X & Y == X

issubset(Counter("ab"), Counter("aab"))  # returns True
issubset(Counter("abc"), Counter("aab")) # returns False

这是在中使用的标准概念。

{'a','a','b','c'}
{'a','b','c'}
完全相同。这是集合的点。在Python中,集合不能有重复项。在寻找多集合之前,您可能不想使用可以被认为是多网络的集合。然后使用。计数器不会这样做,因为
计数器('aabc'))那么,如果我要测试字符串中的字符,有没有一种方法可以测试string2中每个string1字符的成员身份,并考虑到它出现的次数?这里有没有一种逃避列表理解的方法?我不确定你所说的“考虑到它出现的次数”是什么意思。你的意思是如果“a”在string1中出现x次,那么“a”在string2中应该出现x次以上吗?列表理解是Python语言的一个关键部分。接受它们:)(如果不理解它们,可以先将它们作为for循环编写)
=
似乎不匹配
\uuuule\uuuuu
?我认为应该有
这不是多集
这是最好的答案。它很简单,不需要创建第二个类。
>>> 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
>>> 
from collections import Counter

def issubset(X, Y):
    return len(Counter(X)-Counter(Y)) == 0
def issubset(X, Y):
    return all(v <= Y[k] for k, v in X.items())
from collections import Counter

def issubset(X, Y):
    return X & Y == X

issubset(Counter("ab"), Counter("aab"))  # returns True
issubset(Counter("abc"), Counter("aab")) # returns False