上QQ阅读APP看书,第一时间看更新
4.2.3 实践演练——在链表中增加比较功能
判断元素是否相等的操作符是“==”,我们可以使用此操作符定义单链表的一个相等比较函数。在下面的实例文件bijiao.py中,基于本章上一个范例增加比较操作函数,并且基于字典序的概念为链表定义大于、小于、大于或等于、小于或等于的判断功能。文件bijiao.py的主要实现代码如下所示。
源码路径:daima\第4章\bijiao.py
class LList: """ 省略已实现部分 """ #根据索引获得该位置的元素 def __getitem__(self, key): if not isinstance(key, int): raise TypeError if 0<=key<len(self): p = self._head num = -1 while p: num += 1 if key == num: return p.elem else: p = p.next else: raise IndexError #判断两个列表是否相等 def __eq__(self, other): #两个都为空列表,则相等 if len(self)==0 and len(other)==0: return True #两个列表中的元素个数相等,当每个元素都相等的情况下,两个列表相等 elif len(self) == len(other): for i in range(len(self)): if self[i] == other[i]: pass else: return False #全部遍历完后,两个列表相等 return True #两个列表中的元素个数不相等,返回Fasle else: return False #判断两个列表是否不相等 def __ne__(self, other): if self.__eq__(other): return False else: return True # 判断一个列表是否大于另一个列表 def __gt__(self, other): l1 = len(self) l2 = len(other) if not isinstance(other, LList): raise TypeError # 1.len(self) = len(other) if l1 == l2: for i in range(l1): if self[i] == other[i]: continue elif self[i] < other[i]: return False else: return True #遍历完都相等的话,说明两个列表相等,所以返回False return False # 2.len(self) > len(other) if l1 > l2: for i in range(l2): if self[i] == other[i]: continue elif self[i] < other[i]: return False else: return True #遍历完毕,前面的元素全部相等,则列表中元素个数多的一方大 #if self[l2-1] == other[l2-1]: return True # 3.len(self) < len(other) if l1 < l2: for i in range(l1): if self[i] == other[i]: continue elif self[i] < other[i]: return False else: return True #遍历完毕,前面的元素全部相等,则列表中元素个数多的一方大 #if self[l2-1] == other[l2-1]: return False # 判断一个列表是否小于另一个列表 def __lt__(self, other): #列表相等情况下,>会返回False,<在这里的判断会返回True,有错误。所以要考虑在相等的情况下也为False if self.__gt__(other) or self.__eq__(other): return False else: return True # 判断一个列表是否大于或等于另一个列表 def __ge__(self, other): """ if self.__eq__(other) or self.__gt__(other): return True else: return False """ #大于或等于和小于是完全相反的,所以可以依靠小于实现 if self.__lt__(other): return False else: return True # 判断一个列表是否小于或等于另一个列表 def __le__(self, other): """ if self.__eq__(other) or self.__lt__(other): return True else: return False """ ##小于或等于和大于是完全相反的,所以可以依靠大于实现 if self.__gt__(other): return False else: return True if __name__=="__main__": mlist1 = LList() mlist2 = LList() mlist1.append(1) mlist2.append(1) mlist1.append(2) mlist2.append(2) #mlist1.append(2) mlist2.append(6) mlist2.append(11) mlist2.append(12) mlist2.append(14) mlist1.printall() mlist2.printall() print(mlist1 == mlist2) print(mlist1 != mlist2) print(mlist1 <= mlist2) print(mlist2.__getitem__(1)) print(mlist1.__ne__(mlist2))
执行后会输出:
1, 2 1, 2, 6, 11, 12, 14 False True True 2 True