Python高级数据类型

发布时间:2023-12-31 14:30:31

命名元组

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)]
  1. 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)
文章来源:https://blog.csdn.net/ringnian/article/details/135315460
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。