美文网首页
Python高级数据类型

Python高级数据类型

作者: 卡门001 | 来源:发表于2023-05-16 19:53 被阅读0次
    • 命名元组
    • 双端队列
    • 计数器
    • 字典和列表子类化

    一、命名元组

    定义

    • 完成对命名元组的简单操作
    • Python中提供了基础的不可变数据结构元组tuple,对元组元素的访问需通过索引来完成,对此需要熟记每个下标对应的具体含义。如果元素数量一多,要记清楚这些东西就会比较麻烦了,于是就出现了命名元组namedtuple
    • 可通过collections.namedtuple创建的命名元组(类)

    创建命名元组

    • 命名元组的构造函数接受两个参数:typename,field_names:
    • typename:元组的名字;
    • field_names:元组各个元素的名称,也就是属性名称。

    例: 以下语句创建了一个叫做Point的命名元组类,它拥有两个属性x,y。

    collections.namedtuple("Point",["x","y"])
    
    #----或以下写法也是可以的---
    collections.namedtuple("Point","x y")
    collections.namedtuple("Point","x,y")
    

    将命名元组赋给一个变量

    MyPoint = collections.namedtuple("Point","x,y")
    

    新建的元组变量,它只是一个类,如果要创建它的实例,则需要像创建类实例一样调用它:

    MyPoint = collections.namedtuple("Point", "x,y")
    p1 = MyPoint(x=1, y=2)
    # x元素,下标0, y元素,下标1
    print(p1.x,p1.y)
    print(p1[0],p1[1])
    

    修改元素

    修改元组的元素不能简单的使用p1.x = 1,需要调用成员函数 _replace(),它会返回一个包含新值的新实例。

    p1 = p1._replace(x = 1) #将p1的x值从0换到1
    

    二、双端队例

    双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样。

    标准库collections.deque

    from collections import deque
    class Deque:
        def __init__(self):
            self.items = deque()
        def addFront(self, item):
            self.items.appendleft(item)
        def addRear(self, item):
            self.items.append(item)
        def removeFront(self):
            return self.items.popleft()
        def removeRear(self):
            return self.items.pop()
        def empty(self):
            return self.size() == 0
        def size(self):
            return len(self.items)
    

    应用 - 回文算法

    算法:回文(palindrome)是正读反读都一样的单词或句子,是一种修辞方式和文字游戏。
    举例:

    madam
    able was i ere i saw elba
    # 中文
    花非花
    人人为我、我为人人
    

    如果要实现一个 回文验证算法(验证一个给定的字符串是否为回文),使用Deque类将非常容易:将字符串存储到双端队列,同时取出首尾字符并比较是否相等,只要有一对字符不等,则该字符串不是回文;若全部相等,则该字符串为回文。具体代码如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    def palchecker(aString):
        chardeque = Deque()
        for ch in aString:
            chardeque.insert(ch)
        while chardeque.size() > 1:
            first = chardeque.popFront()
            last = chardeque.pop()
            if first != last:
                return False
        return True
    
    
    if __name__ == '__main__':
        str1 = 'able was i ere i saw elba'
        print('"%s" is%s palindrome' % (str1, '' if palchecker(str1) else ' not'))
        str2 = u'人人为我、我为人人'
        print(u'"%s"%s是回文' % (str2, u'' if palchecker(str2) else u'不'))
        str3 = u"What's wrong 怎么啦"
        print(u'"%s"%s是回文' % (str3, u'' if palchecker(str3) else u'不'))
    

    计数器

    相关文章

      网友评论

          本文标题:Python高级数据类型

          本文链接:https://www.haomeiwen.com/subject/rmvvsdtx.html