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)
相关推荐
深度学习lover31 分钟前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
阡之尘埃3 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
记录成长java4 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山4 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js