什么是容器?
可以存放多个元素的一种数据类型,补充变量的无法存储大量数据的缺陷。
Python提供的容器
- 列表(list)
- 集合(set)
- 元组(tuple)
- 字典(dict)
线性表:
数组:数组是连续内存的结构, python是没有数组
栈:先进后出,后进先出(FILO:first in last out)
队列:先进先出,后进后出(FIFO:first in first out)
列表:
单向链表:(数据|下一个指针地址) 双向链表:(上个指针地址|数据|下一个指针地址)
一、列表(list)
列表是基于双向链表实现的
1.1 定义
-
直接赋值
>>> ls1 = [1,2,3,4,5]
-
全局函数 list()
>>> ls2 = list() >>> ls3 = list([2,3,4,5,6])
1.2 访问元素
使用下标来访问元素(下标从0开始计),也可以通过下标来修改元素的值
>>> ls1[0]
1
>>> ls3[4]
6
>>> ls1[0] = 2
>>> ls1
[2, 2, 3, 4, 5]
1.3 遍历
#while循环
index = 0
while index < len(ls):
print(ls[index])
index += 1
#for循环:
for i in ls:
print(i)
全局函数 len(容器) # 返回容器的长度
1.4 常见方法
-
append() 向列表尾部追加元素
>>> ls1 [2, 2, 3, 4, 5] >>> ls1.append(7) >>> ls1 [2, 2, 3, 4, 5, 7]
-
insert() 向指定的位置追加元素
>>> ls1 [2, 2, 3, 4, 5, 7] >>> ls1.insert(1,1) >>> ls1 [2, 1, 2, 3, 4, 5, 7]
-
sort() 排序(一般用来排序数字)
>>> ls1 [2, 1, 2, 3, 4, 5, 7] >>> ls1.sort() >>> ls1 [1, 2, 2, 3, 4, 5, 7]
-
index() 查找元素第一次在列表中出现的位置。如果没有这个元素,则抛出异常
>>> ls1 [1, 2, 2, 3, 4, 5, 7] >>> ls1.index(4) 4 >>> ls1.index(7) 6
-
reverse() 将列表元素顺序翻转
>>> ls1 [1, 2, 2, 3, 4, 5, 7] >>> ls1.reverse() >>> ls1 [7, 5, 4, 3, 2, 2, 1]
-
remove() 通过元素来移除元素。若同一个元素存在多次,仅删除顺序排列的第一个。如果元素不存在,则抛出异常。
>>> ls1 [7, 5, 4, 3, 2, 2, 1] >>> ls1.remove(2) >>> ls1 [7, 5, 4, 3, 2, 1]
-
count() 统计元素个数
>>> ls1 [7, 5, 4, 3, 2, 1] >>> ls1.append(4) >>> ls1.count(4) 2
-
clear() 清除元素
>>> ls3 [2, 3, 4, 5, 6] >>> ls3.clear() >>> ls3 []
-
copy() 浅拷贝对象,是在堆内存中进行对象拷贝的.注意和赋值的区别
>>> ls1 [7, 5, 4, 3, 2, 1, 4] >>> ls2 [] >>> ls3 [] >>> ls2 = ls1.copy() >>> ls3 = ls1 >>> ls2 [7, 5, 4, 3, 2, 1, 4] >>> ls3 [7, 5, 4, 3, 2, 1, 4] #浅拷贝和赋值的区别: >>> ls1.remove(3) >>> ls1 [7, 5, 4, 2, 1, 4] >>> ls2 [7, 5, 4, 3, 2, 1, 4] >>> ls3 [7, 5, 4, 2, 1, 4]
-
extend 合并列表
>>> ls1 [7, 5, 4, 2, 1, 4] >>> ls2 [7, 5, 4, 3, 2, 1, 4] >>> ls1.extend(ls2) >>> ls1 [7, 5, 4, 2, 1, 4, 7, 5, 4, 3, 2, 1, 4]
-
pop() 删除最后元素,并返回这个元素
>>> ls1 [7, 5, 4, 2, 1, 4, 7, 5, 4, 3, 2, 1, 4] >>> ls1.pop() 4 >>> ls1 [7, 5, 4, 2, 1, 4, 7, 5, 4, 3, 2, 1]
二、集合(set)
集合的底层是基于哈希表(hash)实现的。所以它也具有哈希表的特点:每个元素唯一(无重复)、无序
2.1 定义
-
直接赋值
>>> s1 = {1,2,3,4} # {}至少要有一个元素,此时才是集合 >>> s2 = {} # 如果使用空的{}来创建一个对象,该对象是字典,并不是集合 >>> type(s1) <class 'set'> >>> type(s2) <class 'dict'>
-
全局函数:set()
>>> s3 = set() # 使用全局函数set来创建一个集合 >>> s4 = set({2,3,4,5}) # 创建集合,并赋值 >>> type(s3) <class 'set'>
2.2 常见方法
-
clear()
>>> s1 {1, 2, 3, 4} >>> s1.clear() >>> s1 set()
-
remove()
>>> s1 {1, 2, 3, 4} >>> s1.remove(2) >>> s1 {1, 3, 4}
-
copy()
>>> s1 {1, 3, 4} >>> s2 {} >>> s2 = s1.copy() >>> s2 {1, 3, 4}
-
add():增加元素
>>> s1 {1, 3, 4} >>> s1.add(7) >>> s1 {1, 3, 4, 7}
-
difference():差集
>>> s1 {1, 3, 4, 7} >>> s2 {1, 3, 4} >>> s2.difference(s1) #s2相较于s1的差集 set() >>> s1.difference(s2) #s1相较于s2的差集 {7}
-
intersection():交集
>>> s1 {1, 3, 4, 7} >>> s2 {1, 3, 4} >>> s1.intersection(s2) {1, 3, 4} >>> s2.intersection(s1) {1, 3, 4}
-
union():并集
>>> s1 {1, 3, 4, 7} >>> s2 {1, 3, 4, 9, 'wang'} >>> s1.union(s2) {1, 3, 4, 7, 9, 'wang'} >>> s1 {1, 3, 4, 7} >>> s2 {1, 3, 4, 9, 'wang'}
-
update():先求并集,再更新集合
>>> s1 {1, 3, 4, 7} >>> s2 {1, 3, 4, 9, 'wang'} >>> s1.update(s2) >>> s1 {1, 3, 4, 7, 9, 'wang'} >>> s2 {1, 3, 4, 9, 'wang'}
-
discard():移除元素,但是如果不存在,则不做任何操作
>>> s1 {1, 3, 4, 7, 9, 'wang'} >>> s1.discard(7) >>> s1 {1, 3, 4, 9, 'wang'}
三、元组(tuple)
对应其他语言中的常量、枚举类型
元组是一个不可变类型。元组中的元素一旦定义,则无法改变
注意:当元组内部的元素是可变类型时,那么元组就可变了(也仅只能改变这个可变类型中的值)
3.1 定义
-
直接赋值
>>> t1 = (1,2,3,[2,3,4]) #注意:如果使用赋值类型定义元组且只有一个元素,切记添加,分割。否则该()被视为数学运算中的提升优先级符号。 >>> t4 = (5) >>> type(t4) <class 'int'> >>> t5 = (7,) >>> type(t5) <class 'tuple'>
-
全局函数:tuple()
>>> t2 = tuple() >>> t3 = tuple((2,3,4))
3.2 元素访问
使用下标来访问元素(下标从0开始计),也可以通过下标来修改可变类型元素的值
>>> t
(1, 2, 3, [2, 3, 4])
>>> t[2]
3
>>> t[3]
[2, 3, 4]
>>> t[3].append(9)
>>> t
(1, 2, 3, [2, 3, 4, 9])
3.3 常见方法
-
index()
>>> t (1, 2, 3, [2, 3, 4, 9]) >>> t.index(3) 2
-
count()
(11, 22, 3, 4, 5, 44, 11, 1, 22) >>> t.count(22) 2
四、字典(dict)
键值对形式存储 key:value
4.1 定义
-
直接赋值
>>> d1 = {"name":"wang","age":18,"gender":"男"}
-
全局函数:dict()
>>> d2 = dict({"name":"qin","age":16,"gender":"女"})
4.2 元素访问
通过key来访问对应的值
-
字典对象[key]:返回key对应的值,如果没有,抛出异常
{'name': 'wang', 'age': 18, 'gender': '男'} >>> d1["name"] 'wang'
-
修改:字典对象[key] = 新值
>>> d1 {'name': 'wang', 'age': 18, 'gender': '男'} >>> d1["name"] = "chang" >>> d1 {'name': 'chang', 'age': 18, 'gender': '男'}
-
添加新的键值对:字典对象[新key] = 新值
>>> d1 {'name': 'chang', 'age': 18, 'gender': '男'} >>> d1["hobbies"] = "跑步" >>> d1 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'}
4.3 常见方法
-
clear()
>>> d3 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'} >>> d3.clear() >>> d3 {}
-
copy()
>>> d1 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'} >>> d3 {} >>> d3 = d1.copy() >>> d3 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'}
-
get():和字典对象[key]类似,获取键对应值,注意,如果没有该键,返回None
>>> d3 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'} >>> d3.get("hobbies") '跑步'
-
keys():返回所有的键
>>> d3.keys() dict_keys(['name', 'age', 'gender', 'hobbies'])
-
values():返回所有的值
>>> d3.values() dict_values(['chang', 18, '男', '跑步'])
-
items():返回键值对
>>> d3 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'} >>> d3.items() dict_items([('name', 'chang'), ('age', 18), ('gender', '男'), ('hobbies', '跑步')])
-
pop(key):通过key删除键值对
>>> d3 {'name': 'chang', 'age': 18, 'gender': '男', 'hobbies': '跑步'} >>> d3.pop("age") 18 >>> d3 {'name': 'chang', 'gender': '男', 'hobbies': '跑步'}
-
popitem():移除一个键值对,移除的规则是LIFO(last in first out)
>>> d3 {'name': 'chang', 'gender': '男', 'hobbies': '跑步'} >>> d3.popitem() ('hobbies', '跑步') >>> d3 {'name': 'chang', 'gender': '男'}
4.4 遍历
for k in d.keys():
print(k, d.get(k))
for k in d:
print(k, d[k])
for k,v in d.items():
print(k, v)