python数据结构学习笔记-2016-10-17-01-集合

        集合是储存不重复事物的容器。

        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



        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值