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)
相关推荐
数据智能老司机5 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机6 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机6 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机6 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i6 小时前
drf初步梳理
python·django
每日AI新事件6 小时前
python的异步函数
python
这里有鱼汤8 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook17 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室17 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三19 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试