簡體   English   中英

考慮集合中每個元素的數量(多重性),測試set是否為子集

[英]Test if set is a subset, considering the number (multiplicity) of each element in the set

我知道我可以測試set1是否是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)或者是一種保持列表理解的方式。 謝謝!

如評論中所述,使用Counter的可能解決方案:

from collections import Counter

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

對你的問題的簡短回答是沒有設置操作來執行此操作,因為集合定義不提供這些操作。 定義您正在尋找的功能的IE將使數據類型不是一組。

根據定義,集合具有唯一的,無序的成員:

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

結合以前的答案提供了盡可能干凈和快速的解決方案:

def issubset(X, Y):
    return all(v <= Y[k] for k, v in X.items())
  • 在@A.Rodas版本中沒有創建實例而不是3(兩個參數必須已經是Counter類型,因為這是處理多集的Pythonic方法)。
  • 一旦謂詞被偽造,就會早期返回(短路)。

由於@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
>>> 

對於那些對多包含包含的通常概念感興趣的人來說,測試多包含包含的最簡單方法是使用多重集合的交集:

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

這是冪等半環中使用的標准思想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM