一、相关
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
Python中的绝大部分数据结构可以最终分解成三种类型:集合(Set),序列(Sequence),映射(Mapping)。
1、集合是独立于标量,序列和映射之外的特殊数据结构,它支持数学理论的各种集合的运算。它的存在使得用程序代码实现数学理论变得方便。
2、序列是Python中最为基础的内建类型。它分为七种类型:列表、字符串、元组、Unicode字符串、字节数组、缓冲区和xrange对象。常用的是:列表(List)、字符串(String)、元组(Tuple)。
3、映射在Python的实现是数据结构字典(Dictionary)。作为第三种基本单位,映射的灵活使得它在多种场合中都有广泛的应用和良好的可拓展性。
二、常见的Python数据结构
1.列表:list
我们把列表放在第一个来说明他,是因为列表与字符串或元组不同,列表是可变的。对于“可变”和“不可变”有疑问的同学,可以查看《Python学习笔记(六)--------Python函数》,该文章对可变与不可变有详细描述。
Python中有关list的方法
方法 | 描述 |
---|---|
list.append(x) | 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 |
list.extend(L) | 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。 |
list.insert(i, x) | 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。 |
list.remove(x) | 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。 |
list.pop([i]) | 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。) |
list.clear() | 移除列表中的所有项,等于del a[:]。 |
list.index(x) | 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。 |
list.count(x) | 返回 x 在列表中出现的次数。 |
list.sort() | 对列表中的元素进行排序。 |
list.reverse() | 倒排列表中的元素。 |
list.copy() | 返回列表的浅复制,等于a[:]。 |
实践
myList = [1, "Baldwin", (1, 2, 4), {"Jack", "Tom"}, {"money": 40}]
newList = [43]
myList.append({"age": 18}) # 给当前列表新增一个元素
print(myList)
myList.extend(newList) # 通过制定列表来扩充当前列表
print(myList)
myList.insert(1, {"name": "Baldwin"}) # 在下表1的位置上插入
print(myList)
myList.remove(1) # 移除值为1的元素
print(myList)
print(myList.pop(3)) # 移除指定位置元素,并返回这个元素值
myList.clear() # 删除所有元素
print(myList)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[1, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}]
[1, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
[1, {'name': 'Baldwin'}, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
[{'name': 'Baldwin'}, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
{'Jack', 'Tom'}
[]
Process finished with exit code 0
列表在Python中的使用形式比较多,有时候也会基于列表来实现堆栈或者队列
list实现堆栈
堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除(先进后出),可以将堆栈的数据存取理解为往水桶里放书和取书。
list实现堆栈结构主要依托append方法和pop方法,apend方法不再累述,我们来看pop方法的特殊用法:如果没有指定索引,a.pop()返回最后一个元素。依托这两个方法就可以实现堆栈的数据结构要求。
stack = [1, 2, 3, 4, 5]
stack.append(6) #压栈
print(stack)
stack.pop() #出栈
print(stack)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5]
Process finished with exit code 0
list实现队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的数据存取规则可以简说为“先进先出FIFO”,可以理解为排队上车,最先排队的人肯定是最先上车。
用列表实现队列有一些问题,在列表尾部添加或者弹出数据是很快速的,但是要在头部曲插入数据需要移动后面的所有数据,显然这样效率是很低的。
list没有直接使用的在头部弹出的函数,我们在此引入deque
from collections import deque
list = [1,2,3,4,5]
queue = deque(list)
print(queue.popleft()) # 出队
print(queue)
queue.append(18) # 入队
print(queue)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
1
deque([2, 3, 4, 5])
deque([2, 3, 4, 5, 18])
Process finished with exit code 0
列表推导式
列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
myList = [1, 23, 87, 5]
newList = [2 * m + 1 for m in myList]
print(newList)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[3, 47, 175, 11]
Process finished with exit code 0
以上演示了一个简单的列表推导式,列表推导式还有很多有意思的用法,有兴趣的同学可以自己去尝试一下。
2.元组
元组由若干逗号分隔的值组成。
myTuple = (12, 78, 45, 656) # 常规方式定义元组
newTuple = 12, 11, 10 # 特殊方式
print(myTuple)
print(newTuple)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
(12, 78, 45, 656)
(12, 11, 10)
Process finished with exit code 0
元组可以通过两种方法去创建,但是输出时都会带上括号,在此建议使用常规方法去创建
3.集合
集合是一个包含不重复且无需元素的数据结构,在Python中,集合具有关系测试和消除重复元素的功能。
mySet = {1231, 3123, 31231, 1212, 1212}
newSet = {m-1000 for m in mySet}
print(mySet)
print(newSet)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
{3123, 1212, 31231, 1231}
{231, 2123, 212, 30231}
Process finished with exit code 0
上面程序运行我们可以得到3个信息:
1.集合通过大括号{}创建
2.注意观察,我创建集合的时候输入了两个重复的值(最后两个),集合虽然没有报错,但是自动去除了重复值
3.集合同样支持推导式
4.字典
Python中的字典参考Java中的map类型,是一种无序双列数据集,数据以键值对的形式保存,常取字符串或者数值作为键,在一个字典中,键不能重复,但是值是可以重复的。在取值的时候可以通过键来取值
{}创建字典
myDict = {"name": "Baldwin", "age": 18}
print(myDict["name"])
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
Baldwin
Process finished with exit code 0
dict()构造函数创建字典
mydict = dict({'name': 'Baldwin', 'age': 18})
print(mydict)
通过元组+推导式创建字典
mydict = {x:x+11 for x in [1,2,3]}
print(mydict)
三、总结
各种语言数据结构万变不离其宗,学好一门其他的也差不多