Python高级数据类型

命名元组

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

  • 创建命名元组

可通过collections.namedtuple创建的命名元组(类)

以下语句创建了一个叫做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 常用方法包含如下:

    1、append():
    从右端添加元素,与list相同

    2、appendleft():
    从左端添加元素

    3、extend():
    从右端逐个添加可迭代对象,与list相同,Python中的可迭代对象有:列表、元组、字典、字符串

    4、extendleft():
    从左端逐个添加可迭代对象,Python中的可迭代对象有:列表、元组、字典、字符串

    5、pop():
    移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError

    6.popleft():
    移除列表中的一个元素(默认最左端的一个元素),并且返回该元素的值,如果没有元素,将会报出IndexError

    7、count():
    统计队列中的元素个数(与list同)

    8、insert(index,obj):
    在指定位置插入元素(与list同)

    9、rotate(n):
    rotate(n), 从右侧反转n步,如果n为负数,则从左侧反转。
    d.rotate(1) 等于 d.appendleft(d.pop())

    10、maxlen:
    只读的属性,deque限定的最大长度,如果无,就返回None。
    当限制长度的deque增加超过限制数的项时, 另一边的项会自动删除。

    11、remove():
    移除第一次出现的元素,如果没有找到,报出ValueError

    12、clear()
    将deque中的元素全部删除,最后长度为0

  • 应用 - 回文算法

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

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

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

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def palchecker(aString):
    chardeque = collections.deque(aString)
    while len(chardeque) > 1:
        first = chardeque.popleft()
        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'不'))

计数器

可用计算器给可散列的对象计数,或者是当成多重集合来使用 。

多重集合就是集合里的元素可以出现多次1。

用法如下:

  1. 使用前导入

    from collections import Counter

collections.Counter实例

复制代码
counter = collections.Counter(['生物', '印记', '考古学家', '生物', '枣', '印记'])
logging.info('counter -> %s', counter)
 
counter.update(['化石', '果实', '枣', '生物'])
logging.info('counter -> %s', counter)
 
most = counter.most_common(2)
logging.info('most -> %s', most)
  1. 统计词频

    colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
    result = {}
    for color in colors:
    if result.get(color)==None:
    result[color]=1
    else:
    result[color]+=1
    print (result)
    #{'red': 2, 'blue': 3, 'green': 1}

判断是否包含某元素,可以转化为dict然后通过dict判断,Counter也带有函数可以判断

复制代码
c = Counter(['eggs', 'ham'])
print(c)
#Counter({'eggs': 1, 'ham': 1})
 
c['bacon']                              # 不存在就返回0
#0
  1. 删除元素

    c['sausage'] = 0 # counter entry with a zero count
    del c['sausage']

5.获得所有元素

复制代码
c = Counter(a=4, b=2, c=0, d=-2)
print(c)
#Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
 
list(c.elements())
#['a', 'a', 'a', 'a', 'b', 'b']
  1. 查看最常见出现的k个元素

    Counter('abracadabra').most_common(3)
    #[('a', 5), ('r', 2), ('b', 2)]

  2. Counter更新

    c = Counter(a=3, b=1)
    d = Counter(a=1, b=2)
    c + d # 相加
    #Counter({'a': 4, 'b': 3})
    c - d # 相减,如果小于等于0,删去
    #Counter({'a': 2})
    c & d # 求最小
    #Counter({'a': 1, 'b': 1})
    c | d # 求最大
    #Counter({'a': 3, 'b': 2})

字典

复制代码
dict1={'Tom':93,'Jim':80,'Lily':100}

# 使用元组作为dict的key
dict2 = {(20, 30):'good', 30:'bad'}

# 创建包含3组key-value对的字典
vegetables = [('celery', 1.58), ('brocoli', 1.29), ('lettuce', 2.19)]
dict3 = dict(vegetables)

# 创建包含3组key-value对的字典
dict4 = dict(cars)
相关推荐
赤鸢QAQ14 分钟前
ffpyplayer+Qt,制作一个视频播放器
python·qt·音视频
隔壁小查19 分钟前
【后端开发】Spring MVC阶段总结
python·spring·mvc
Funny Valentine-js25 分钟前
swift菜鸟教程1-5(语法,变量,类型,常量,字面量)
开发语言·ios·swift
kgduu30 分钟前
Python编程快速上手 让繁琐工作自动化笔记
python
Jtti41 分钟前
Debian环境下Java应用无法启动的原因有哪些
java·python·debian
上线之叁44 分钟前
小迪安全-tp框架反序列化,利用链,rce执行,文件删除
java·开发语言
想做富婆1 小时前
python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)
python·学习·pycharm
Start_Present1 小时前
Pytorch 第十四回:神经网络编码器——变分自动编解码器
pytorch·python·深度学习·神经网络·数据分析
新知图书1 小时前
第一个Qt开发的OpenCV程序
开发语言·qt
阿斌_bingyu7092 小时前
Arduino开发物联网ESP32快速入门指南(包含开发语言说明、学习路径和实战教程)
开发语言·物联网·学习