Python奇遇记:数据结构窥探

此次咱们来讲说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,带你走进机器学习的世界。
图片描述

相关文章
相关标签/搜索