从set类型继承,并设计一个名为CountedSet的子类型。通过重载set类型的某些函数,使得CountedSet对象 可以统计并记录各个元素被放入集合的总次数。请通过裁判测试程序了解该类的接口。代码
时间: 2024-04-29 11:26:33 浏览: 109
EDA/PLD中的ISO C++基本类型和变量
好的,以下是一个简单的CountedSet类的实现:
```python
from collections.abc import MutableSet
class CountedSet(MutableSet):
def __init__(self, iterable=None):
self.elements = {}
self.total_count = 0
if iterable:
self.update(iterable)
def __contains__(self, element):
return element in self.elements
def __iter__(self):
for element, count in self.elements.items():
for _ in range(count):
yield element
def __len__(self):
return len(self.elements)
def add(self, element):
self.elements[element] = self.elements.get(element, 0) + 1
self.total_count += 1
def discard(self, element):
if element in self.elements:
self.elements[element] -= 1
if self.elements[element] == 0:
del self.elements[element]
self.total_count -= 1
def count(self, element):
return self.elements.get(element, 0)
def __repr__(self):
return f"CountedSet({list(self)})"
```
CountedSet类继承自MutableSet,因此它具有set类型的所有常规行为。但是,CountedSet还有一些额外的功能:
- `add()`方法用于向集合中添加元素,并自动更新元素的计数器。
- `discard()`方法用于从集合中删除元素,并自动更新元素的计数器。
- `count()`方法用于获取特定元素在集合中出现的次数。
- `__repr__()`方法用于返回集合的字符串表示形式,包括每个元素及其出现次数。
我们可以使用以下代码来测试CountedSet的功能:
```python
s = CountedSet([1, 2, 2, 3, 3, 3])
print(s) # CountedSet([1, 2, 2, 3, 3, 3])
print(len(s)) # 3
print(s.count(2)) # 2
s.add(1)
s.add(4)
print(s) # CountedSet([1, 2, 2, 3, 3, 3, 1, 4])
s.discard(2)
print(s) # CountedSet([1, 2, 3, 3, 3, 1, 4])
print(s.count(2)) # 0
```
阅读全文