数据结构Data Structure 数据结构是一种存储和组织数据的方式 一个数据结构可以装下多个数据,多个值
Python 自带的四种基本数据结构
- List Tuple Dictionary Sets
1、List 列表
1.1list创建
- 用[]表示,方括号内罗列想要包含的数据,以逗号分隔
- 可以用list()创建一个新的list
a=[]
b=list()
print(type(a))
print(type(b))
- list是一个有规定顺序的数据结构,里面的元素位置不会发生变化
- 一个list里面可以存放不同的数据类型,但一般都做法都是只存放一种数据类型来保证代码可读性
b=['',2,True,"34","你好",None]
print(f"这个list中一共装了{len(b)}个东西\n")
for i in b:
print(f"{i}:数据类型是{type(i)}")
这个list中一共装了6个东西
:数据类型是<class 'str'>
2:数据类型是<class 'int'>
True:数据类型是<class 'bool'>
34:数据类型是<class 'str'>
你好:数据类型是<class 'str'>
None:数据类型是<class 'NoneType'>
- 一个list里也可以装不同的数据结构,包括list
family1="刘星 夏雪 夏雨"
#list
family2=["刘星","夏雪","夏雨"]
#dictionary
family3={"大女儿":"夏雪","大儿子":"刘星","小儿子":"夏雨"}
c=[2,family1,family2,family3]
print(f"这个list中一共装了{len(c)}个东西\n")
for i in c:
print(f"{i}:数据类型是{type(i)}")
这个list中一共装了4个东西
2:数据类型是<class 'int'>
刘星 夏雪 夏雨:数据类型是<class 'str'>
['刘星', '夏雪', '夏雨']:数据类型是<class 'list'>
{'大女儿': '夏雪', '大儿子': '刘星', '小儿子': '夏雨'}:数据类型是<class 'dict'>
1.2 list索引和切片
与str相似,也可以进行正负索引 与str切片很相似,用[开始:结尾:步距]截取其中一段
a=[1,2,3,4,5,6,7,8]
a[2:]
a[0:4]
a[0:4:2]
[3, 4, 5, 6, 7, 8]
[1, 2, 3, 4]
[1, 3]
1.3 list修改和运算
与str不同,它可以利用赋值 = 直接替换里面的数据
因为它是一个可变对象 常用的运算符+ * in 同类型数据结构才能相+ ,也就是list只能+list
family=["刘星","夏雪","夏雨"]
family[0]="大儿子"
family
['大儿子', '夏雪', '夏雨']
family=family+['刘梅','夏东海']
family
'刘星', '夏雪', '夏雨', '刘梅', '夏东海']
family*2
['刘星', '夏雪', '夏雨', '刘梅', '夏东海', '刘星', '夏雪', '夏雨', '刘梅', '夏东海']
"夏东海" in family
True
1.4 list相关函数
- 内置函数 len() max() 只能对比包含同一数据类型的list
- min() 只能对比包含同一数据类型的list
- sum()
- scored() 默认自小到大排序,添加 reverse=True,变为从大到小排序
- list() 转换或者说创建一个list
- any() 只要列表中有一个True,就返回True
- all() 只有列表中全是True,才返回True
- enumerate() 会自动标记序号
a=[24,32,1,0.2]
len(a)
max(a)
min(a)
sum(a)
sorted(a)
a=list(range(3,19,3))
shuma=["太一","大和","素娜","光子郎","美美","阿熏","嘉儿"]
for l,p in enumerate(shuma):
print(f"{l}:{p}")
0:太一
1:大和
2:素娜
3:光子郎
4:美美
5:阿熏
6:嘉儿
1.5 常用的list方法
list.append() 添加
-
list.insert(num,元素) 特定位置添加,如果特定位置超过list范围,则默认是最后一位image.png
list.pop() 默认移除最后一位 还可以指定移除哪个值
-
list.remove() 默认移除顺位第一个数据,如果移除数据不在范围内,则报错image.png
-
list.extend()合并其他list,调用extend()的list才是被改变的,还可以合并其他数据结构,合并字符串时会自动将字符串拆分成list再合并image.png
list.copy()复制一个list
-
list.clear()清空listimage.png
1.6 list搜索、统计、排序
- list.index() 搜索list,找到位置 如果搜索元素不存在,则报错
- list.count() 计算某个元素出现的次数
- list.reverse() 逆转顺序
- list.sort() 重新排序 参数reverse=True 降序 可以设定自己的排序规则,用一个函数定义排序规则 key=abs 使用绝对值排序
f4=['道明寺', '花泽类', '刘能', '赵四', '谢广坤', '王老七']
f4.reverse()
['王老七', '谢广坤', '赵四', '刘能', '花泽类', '道明寺']
a=[-300,49,51,1,0,-2.4]
a.sort(reverse=True)
a
[51, 49, 1, 0, -2.4, -300]
a.sort(key=abs)
a
[0, 1, -2.4, 49, 51, -300]
list 变化无常,本身list是一个可变的数据结构
在对原有数据进行修改时,容易出岔子
使用list.copy()复制一个新的list作为修改对象
不要使用赋值的方式newlist=list
因为在对newlist进行修改时,list也会发生变化
1.7 list 的推导式
用来快速生成列表的写法
#在括号中直接放一个range
cheng2=[x*2 for x in range(10)]
cheng2
等同于下面代码
cheng2=[]
for x in range(10):
cheng2.append(x*2)
cheng2
结果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
#还有其他的用法
word=["往无前","事无成","表人才","意孤行","动不动"]
words=["一"+ x for x in word]
words
结果
['一往无前', '一事无成', '一表人才', '一意孤行', '一动不动']
#可以加条件判断
number1=[3,40,12,4,9,17,19,5,29]
number2=[x*2 for x in number1 if x%2!=0]
number2
结果
[6, 18, 34, 38, 10, 58]
2、元组
2.1 tuple创建
- tuple 与list 很相似
- 用()表示,以逗号进行分割,在Python中识别元组的是逗号而非括号,所以逗号必不可少,在仅有一个元素的情况下,要在元素后面添加逗号,否则无法识别为元组
- 不用括号,也可创建元组
- tuple() 创建
a=()
a=(2,)
a=2,
b=tuple()
2.2 tuple的语法规则
- tuple语法规则与运算和list完全一致
- 有固定顺序
- 有索引和切片
- 包含不同的数据结构,可以嵌套
- 常用运算符
- 内置函数基本都有一样效果
- 配合for 和 range
- tuple 是一个不可变对象,不接受重新赋值,但是如果tuple中包含list,可以修改list,反过来list中的tuple不能修改
#创建一个含有list的tuple
fuzhu=["唐僧","猪八戒","沙和尚"]
team=("孙悟空",fuzhu)
team
('孙悟空', ['唐僧', '猪八戒', '沙和尚'])
team[1][2]="沙悟净"
team
('孙悟空', ['唐僧', '猪八戒', '沙悟净'])
2.3 tuple的packing 打包 和unpacking 拆包
#打包
k=1,2,3
k
(1, 2, 3)
#拆包
a,b,c=k
c
3
#拆包的另一种形式 *+变量表示tuple中剩余的其他元素
d,*e=k
e
[2, 3]
2.4 tuple的内置函数
- tuple() 创建一个新的元组或者转换其他数据为元组(将数据拆分为元组)
- zip
- tuple的方法
- tuple.index()
- tuple.count()
d="习武之人切记仁者无敌"
tuple(d)
('习', '武', '之', '人', '切', '记', '仁', '者', '无', '敌')
什么时候用tuple 什么时候用list
一般tuple 用来装不同的数据类型,list用来装相同的数据类型
遍历tuple 要比list快,因为tuple不可变
如果希望数据结构不变,用tuple
3、set 集合
3.1 set 创建
- 用{}表示
- 可用set()创建集合 但不能单纯用空{}创建 set()创建时里面要包含一个可迭代的对象,可以是list tuple range
- 里面的元素自动被过滤,不会重复
- set是一个没有固定顺序的数据结构,里面的元素都是不确定的
- 一个set里面不能含有可变对象(list dict set) 但可以涵盖不同数据类型
···
a={1,2,3}
b=set()
b=set({1,2,3})
···
3.2 set 内置函数
- set 无序,所以不能使用索引和切片 仅能用for
- 如果单纯的需要判断某个元素是存在,可以用set ,查询速度快
- set 相关函数
- set.add() 添加一个元素
- set.update() 添加多于1个元素
- set.remove() 删除一个元素,如果元素不存在,报错
- set.discard()删除一个元素,如果元素不存在,也不会报错
- set.copy() 可变对象,使用copy
- set.clear() 清空
wangzhe={"狮子","老虎","豹子"}
wangzhe.add("大象")
wangzhe.update(["猴子","长颈鹿"])
wangzhe
{'大象', '狮子', '猴子', '老虎', '豹子', '长颈鹿'}
wangzhe.discard("大象")
wangzhe.remove("猴子")
wangzhe
{'狮子', '老虎', '豹子', '长颈鹿'}
3.3 set 充当数学集合进行运算
- set.union()并集
- set.intersection() 交集
- set.difference() 差集
- set.symmetric_differemce() 对称差集
a={1,3,5,7,9}
b={1,2,3,4,5}
#并集
a.union(b)
#交集
a.intersection(b)
#差集
a.difference(b)
#对称差集
a.symmetric_difference(b)
4、dict
关键字:值
- dict 没有顺序,不能用位置索引
- dict 的查找和插入速度不会像list一样随着元素的增加而变慢,但是占用空间大
- 可变对象,不能有重复的key,但可以有重复的value
4.1 dict 创建
- 可用{} dict()
- 也可以使用2个list,用zip()拆解,快速创建1个dict
allsongs={"晴天":"周杰伦","七里香":"周杰伦","曹操":"林俊杰"}
#也可以使用2个list,用zip()拆解,快速创建1个dict
song=["晴天","七里香","曹操"]
songer=["周杰伦","周杰伦","林俊杰"]
songlist=dict(zip(song,songer))
songlist
结果都是
{'晴天': '周杰伦', '七里香': '周杰伦', '曹操': '林俊杰'}
#另一种写法,key不能有双引号
worker=dict(大熊="打工人",静香="尾款人")
worker
#另一个写法,多个tuple合并成一个list
number=dict([(1,True),(2,False),(3,False)])
number
结果:
{'大熊': '打工人', '静香': '尾款人'}
{1: True, 2: False, 3: False}
4.2 dict 查找
- key 唯一,不可变对象
- dict 依据key查找value
- dict.get() 查找,查找不到不会报错
- dict[] 查找不到会报错
- dict.pop(key) 删除
- dict.popiten() 默认删除最后插入的key value值,适用3.7及以上版本
- dict.clear()
dict[key]="value" 如果key不存在则插入,如果key存在则修改
worker={'大熊': '打工人', '静香': '收款', '哆啦': 'A 梦'}
worker.pop("哆啦")
worker
{'大熊': '打工人', '静香': '收款'}
4.3 dict 访问和修改
- 遍历dict 的3中常用方式
- 直接用for 仅能遍历key
- 使用dict.items() 取出key 和 value
- 使用dict.values() 取出value 或者dict.key()取出key
worker={'大熊': '打工人', '静香': '收款', '哆啦': 'A 梦'}
for i in worker.items():
print(i)
('大熊', '打工人')
('静香', '收款')
('哆啦', 'A 梦')
for k,v in worker.items():
print(k)
print(v)
大熊
打工人
静香
收款
哆啦
A 梦
for i in worker.values():
print(i)
打工人
收款
A 梦
4.4 dict 推导式
nsquare = {n:n**2 for n in range(10)}
nsquare
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
4.5 dict 的相关函数
- len()
- sorted()
- dict 的方法
- dict.copy()
- dict.fromkeys() 从一个list 快速创建dict
- dict.update() 合并2个dict
#从一个list快速创建dict,不指定value
worker={'大熊': '打工人', '静香': '收款', '哆啦': 'A 梦'}
worker3=dict.fromkeys(['哆啦', '大熊', '静香'])
worker3
结果
{'哆啦': None, '大熊': None, '静香': None}
#从一个list快速创建dict,指定value
worker4=dict.fromkeys(['哆啦', '大熊', '静香'],"打工人")
worker4
{'哆啦': '打工人', '大熊': '打工人', '静香': '打工人'}
#合并2个dict
allsongs={"晴天":"周杰伦","七里香":"周杰伦","曹操":"林俊杰"}
worker.update(allsongs)
worker
{'大熊': '打工人', '静香': '打工人', '哆啦': '打工人', '晴天': '周杰伦', '七里香': '周杰伦', '曹操': '林俊杰'}