此次咱们来讲说python中的数据结构。固然了,不会讲很基础的内容。python
用过python的都知道,python有着与其余语言很不同的数据类型,像什么列表、元组、集合、字典之类。这些数据类型造就了python简单易用同时又很强大的特性。通常来讲,咱们会将python中的数据类型分为可变和不可变类型,可变的意思就是你能够修改像列表中的数据,不可变固然就是不能修改啦。还有一种分法是分为扁平类型和容器类型,其中扁平类型存放的是实际的值,包括str, bytes, bytearray,array.array这些,而容器类型存放的是数据值的引用,包括list,tuple,collections.deque这些。数组
既然是讲数据结构,咱们来看看python中不常常用到的一些数据类型。数据结构
没错,python是有数组类型的。当你有很大的数据须要处理的时候,它比列表更高效。如何建立一个数组?使用array.array。好比咱们建立一万个随机浮点数。app
from array import array from random import random # array中的第一个参数表明数据类型,好比float,char等。第二个参数为可迭代的数据。 # d表明双精度浮点类型 data = array('d', (random() for i in range(10**7))) # 输出最后一个元素看看 print(data[-1])
0.5888905969627429
数组中提供了一些颇有用的方法来处理数据,好比pop,insert,同时也有写入文件的tofile和读取的frombytes方法。dom
with open('data.bin', 'wb') as fp: data.tofile(fp)
学过数据结构的都知道队列,双端队列就是两边均可以进出的队列。python中的双端队列使用collections.deque表示。固然了你若是想用它来表示栈也是没问题的。append方法用来添加,pop方法用来弹出。怎么使用?机器学习
from collections import deque data = deque(range(10), maxlen = 3) print(data)
deque([7, 8, 9], maxlen=3)
如上所示,第一个参数为数据,第二个参数是队列的最大长度,若是不指定则默认为无限长。若是限制了长度,则增长数据会挤掉最早插入的数据。函数
data.append(3) # 挤掉了7 print(data) data.pop() print(data)
deque([8, 9, 3], maxlen=3) deque([8, 9], maxlen=3)
python中实现了堆排序。你能够用堆排序来查找一个序列中最大的或者最小的几个元素。好比咱们有一个列表:学习
import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] # 找出最大的几个 print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] # 找出最小的几个 print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]
[42, 37, 23] [-4, 1, 2]
使用nlargest能够找出最大的几个元素,相反的nsmalllest找最小的几个元素。若是须要找的是字典类型呢?还有第三个参数key,指定咱们对数据进行的操做,key接受一个函数。spa
在下面的例子中,咱们须要对字典按价格大小来排序查找。code
portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ] # key接受一个匿名函数,这个函数的做用是找出字典中price的值。 cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price']) expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price']) print(cheap) print(expensive)
[{'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}] [{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]
若是你仅仅想查找惟一的最小或最大(N=1)的元素的话,那么使用 min() 和 max() 函数会更快些。
除了使用堆排序,python中还有sorted排序和list.sorted,这两个排序最终生成以列表表示的排序结果,堆排序也是。不过sorted在排序时会新建一个列表再进行排序,而list.sorted会直接对数据进行就地排序,并且要求输入的数据必须为列表。
什么是具名元组?有时候咱们须要用一个类来表示某个事物,可是并不想定义一个类而后咔哒咔哒写一大段类的表示,这个时候就可使用具名元组,它能够用来快速生成类。比方说定义一个学生类,属性包括姓名,年龄,学号:
from collections import namedtuple # 第一个参数是类的名字,第二个参数为类中的数据,能够为字符串,或者字符串组成的列表 Student = namedtuple("Student", ['name', 'age', 'id']) Studen = namedtuple("Studen", "name age id") s1 = Studen('zhuzhezhe', '23', '001') s2 = Student('zhuzhezhe', '23', '001') print(s1) print(s2)
Studen(name='zhuzhezhe', age='23', id='001') Student(name='zhuzhezhe', age='23', id='001')
具名元组放在collections模块下的nametuple中,第一个参数是类的名字,第二个参数为类中的数据,能够为字符串,或者字符串组成的列表。
以上就是一些不太常见的数据类型的介绍,固然不止这些,具体能够看看python官方手册。
下次咱们来讲说python中常见数据类型的一些不常见的用法,若是用到了效率会翻倍。
本人才疏学浅,上文中不免有些错误,还请各位品评指正。若是以为写的还行,欢迎关注个人公众号MLGroup,带你走进机器学习的世界。