集合是储存不重复事物的容器。
3.1 集合ADT
集合具有无重复元素,无序、长度不确定等特点。其具有方法:
- Set():创建空集合;
- length():返回集合的基数,可使用len()函数;
- contains(element):判断给定元素是否在集合中;
- add(element):向集合添加一个元素;
- remove(element):删去集合中的一个元素,若元素不存在,则引发异常;
- equals(setB):判断两集合是否相同;
- isSubsetOf(setB):判断是否是setB的子集;
- union(setB):返回集合与setB的并集;
- interset(setB):返回集合与setB的交集;
- difference(setB):返回集合与setB的差集;
- iterator():返回迭代器。
#-*-coding: utf-8-*-
from linearset import MySet
smith = MySet()
smith.add("CSCI-112")
smith.add("MATH-121")
smith.add("HIST-340")
smith.add("ECON-101")
roberts = MySet()
roberts.add("POL-101")
roberts.add("ANTH-230")
roberts.add("CSCI-112")
roberts.add("ECON-101")
if smith == roberts:
print "Smith and Roberts are taking the same courses."
else:
sameCourses = smith.interset(roberts)
if sameCourses.isEmpty():
print "Smith and Roberts are not taking any of the same courses."
else:
print "Smith and Roberts are taking some of the same courses."
for course in sameCourses:
print course
3.1.2 集合的实现
目前有三种数据类型可用于实现集合,分别是字典、数组和列表。字典储存键值对,占用内存太多,每一项要占用两个数据字段。数组的长度是固定的,无法满足集合不确定的特点。所以目前只有列表能较好满足实现集合的要求,但要确保无重复元素出现。(以后还有更好的数据类型来实现集合)
#-*-coding: utf-8-*-
# 使用python列表实现集合ADT
class MySet(object):
def __init__(self):
self._theElements = list()
# 集合的基数
def __len__(self):
return len(self._theElements)
def isEmpty(self):
if len(self):
return False
else:
return True
# 判断元素从属
def __contains__(self, element):
return element in self._theElements
# 添加新元素
def add(self, element):
if element not in self: # 判断元素是否已存在,若存在则无操作(noop)
self._theElements.append(element)
# 删除元素
def remove(self, element):
assert element in self, "The element must be in the set."
self._theElements.remove(element)
# 判断两集合是否相等
def __eq__(self, other):
if len(self) != len(other):
return False
else:
return self.isSubsetOf(other)
# 判断子集
def isSubsetOf(self, other):
for element in self:
if element not in other:
return False
return True
# 并集,整体思路是创建新集合,并将一个集合的所有元素放进去,再遍历另一个集合,若有新集合中不存在的元素,则添加该元素
def union(self, other):
newSet = MySet()
newSet._theElements.extend(self._theElements)
for element in other:
if element not in self:
newSet._theElements.append(element)
return newSet
# 交集,与上面类似,建立新集合,将一个集合的所有元素放进去,遍历这一个集合,若有元素不在另一个集合中,则删除该元素
def interset(self, other):
newSet = MySet()
newSet._theElements.extend(self._theElements)
for element in self:
if element not in other:
newSet.remove(element)
return newSet
# 差集
def difference(self, other):
pass
# 迭代器,怎么写?
def __iter__(self):
return _SetIterator(self._theElements)
class _SetIterator(object):
def __init__(self, theSetList):
self._setRef = theSetList
self._curNdx = 0
def __iter__(self):
return self
def next(self):
if self._curNdx < len(self._setRef):
entry = self._setRef[self._curNdx]
self._curNdx += 1
return entry
else:
raise StopIteration