Python高级数据类型
2023-05-16 本文已影响0人
卡门001
- 命名元组
- 双端队列
- 计数器
- 字典和列表子类化
一、命名元组
定义
- 完成对命名元组的简单操作
- 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'不'))