Python学习笔记(七)--------Python数据结构

一、相关

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

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)

三、总结

各种语言数据结构万变不离其宗,学好一门其他的也差不多

 

发布了46 篇原创文章 · 获赞 113 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/shouchenchuan5253/article/details/104964163