Python编程基础实战之数据结构

数据结构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()清空list
    image.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

{'大熊': '打工人', '静香': '打工人', '哆啦': '打工人', '晴天': '周杰伦', '七里香': '周杰伦', '曹操': '林俊杰'}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容