基本数据类型(list,tuple)
基本数据类型(list,tuple)
python基本数据类型
列表 (list)
列表的概念
- 列表是python的基础数据类型之⼀,列表中装的数据是没有限制的, 大小基本上是够用的
- 列表使用[]来表示。 每个元素⽤' , '隔开⽽且可以存放各种数据类型:
lst = [1, '哈哈', "吼吼", [1,8,0,"百度"], ("我","叫", "元", "组"), "abc", {"我叫":"dict字典"},{"我叫集合","集合"}]
列表相比于字符串. 不仅可以存放不同的数据类型. ⽽且可以存放⼤量的数据. 32位 python可以存放: 536870912个元素, 64位可以存放: 1152921504606846975个元素.⽽且列表是有序的(按照你保存的顺序),, 可以切⽚⽅便取值.
有索引和切片
- (索引和切片参照字符串)
#列表 与 字符串 切片打印出的 差异:
# 列表 : (列表是可以发⽣改变的. 这⾥和字符串不⼀样)
lst = ["麻花藤", "王剑林", "⻢芸", "周鸿医", "向华强"]
print(lst[0]) # 获取第⼀个元素 麻花藤
print(lst[1]) # 获取第二个元素
print(lst[2]) # 获取第三个元素
lst[3] = "流动强" # 注意. 列表是可以发⽣改变的. 这⾥和字符串不⼀样
print(lst) # ['麻花藤', '王剑林', '⻢芸', '流动强', '向华强']
# 字符串 :(切记, 字符串是不可变的对象, 所以任何操作对原字符串是不会有任何影响的)
s0 = "向华强"
s0[1] = "美" # TypeError: 'str' object does not support item assignment 不
允许改变
print(s0)
列表步长 sep的坑
- 不写步长: 任意替换, 只要写入步长: 替换的位置必须一一对应(切出来几个位置, 替换几个位置)
lst = [1,2,3,4,5]
lst[1:3] = (10,20)
lst[1:3] = (10,20,30)
lst[1:3,1] = (10,20,30) # 报错
lst[:-3:-1] = (100,200)
lst[:-3:-1] = (100,200,300) # 报错 写入步长 必须一一对应
列表的增删改查
新增
append 追加
- (默认加在列表最后)
insert(索引,内容) 插入
- insert(索引,"加入内容") 在指定位置加入有位置元素后移(可能会导致元素移动)
extend 迭代添加
- int 和 bool值 不可迭代
底层运算
extend :
for i in list:
print(list)
# append :
lst = ["麻花藤", "林俊杰", "周润发", "周芷若"]
print(lst)
lst.append("wusir")
print(lst) # "麻花藤", "林俊杰", "周润发", "周芷若","wusir"
# insert :
lst = ["麻花藤", "张德忠", "孔德福"]
lst.insert(1, "刘德华") # 在1的位置插⼊刘德华. 原来的元素向后移动⼀位
print(lst) # ["麻花藤", "刘德华","张德忠", "孔德福"]
# extend :
lst = ["王志⽂", "张⼀⼭", "苦海⽆涯"]
lst.extend(["麻花藤", "麻花不疼"])
print(lst) # ["王志⽂", "张⼀⼭", "苦海⽆涯","麻花藤", "麻花不疼"]
lst.extend("麻花藤")
print(lst) # ["王志⽂", "张⼀⼭", "苦海⽆涯","麻花藤","麻花不疼","麻","花","藤"]
删除
pop 弹出去
- 默认弹出去最后一个元素
- pop 能点出删除的value 即: pop 有 返回值 例: print(el)
remove 删除指定元素
- 根据填入元素删除
- 有重名的会默认删除第一个(从左向右)
- 删除不存在的元素会报错
clear 清空
- 清空列表里的元素
del 切⽚删除 比较灵活
- del lst[] []里支持索引 切片 删除
# pop :
lst = ["麻花藤", "王剑林", "李嘉诚", "王富贵"]
deleted = lst.pop() # 删除最后⼀个
print("被删除的", deleted) # 被删除的 王富贵
print(lst) # ["麻花藤", "王剑林", "李嘉诚"]
el = lst.pop(2) # 删除2号元素 删除索引
print(el) # 李嘉诚
# remove :
lst.remove("麻花藤") # 删除指定元素
print(lst)
# lst.remove("哈哈") # 删除不存在的元素会报错
# # print(lst)
# clear :
lst.clear() # 清空list
print(lst) # None
# del :
del lst[0]
print(lst) # ["王剑林", "李嘉诚", "王富贵"] 切掉指定位置上的元素
del lst[1:3] # 切掉 索引里的 1和3位置上的元素
print(lst) # ["麻花藤","李嘉诚"]
del lst[::2] # 从头到尾 每两位切一个,切掉 1 3 位元素
print(lst) # ["王剑林","王富贵"]
修改 : (索引切片修改)
lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天"] # 一共5个元素
lst[1] = "太污" # 把1号元素修改成太污
print(lst) # ["太⽩", "太污", "五⾊", "银王", "⽇天"]
lst[1:4:3] = ["麻花藤", "哇靠"] # 切⽚修改也OK. 如果步⻓不是1, 要注意. 元素的个数, 1-4一共选取3个元素,给了两个替换元素会报错, 步长step 若果不是1(默认是1)一定要注意需替换元素个数和替换元素个数
print(lst) # 报错
lst[1:4] = ["李嘉诚个⻳⼉⼦"] # 如果切⽚没有步⻓或者步⻓是1. 则不⽤关⼼个数
print(lst) # 将1至3位元素替换成一个元素["李嘉诚个⻳⼉⼦"](依旧是顾头不顾尾,4号元素取不到)
# 最终打印结果 : ["太⽩", "李嘉诚个⻳⼉⼦", "⽇天"]
查询
- 列表是⼀个可迭代对象, 所以可以进⾏for循环
- 用切片和索引 也可以查
for el in lst:
print(el) # 打印列表里的每一位元素
其他操作
count 查询列表里元素出现次数
sort 排序
- 尽量是数字(汉语排序规则复杂尽量不要用)
- lst.sort() # 排序. 默认升序
- lst.sort(reverse=True) # 降序 此处的 reverse 是 一个排序的参数
reverse 翻转
- 可以理解为镜像 打印原列表
sort 与 reverse 语法一样
len 求列表长度(内置函数)
# count :
lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天", "太⽩"]
c = lst.count("太⽩") # 查询太⽩出现的次数
print(c) # 2
# sort :
lst = [1, 11, 22, 2]
lst.sort() # 排序. 默认升序
print(lst) # [1,2,11,22]
lst.sort(reverse=True) # 降序 此处的 reverse 是 一个排序的参数
print(lst) # [22,11,2,1]
# reverse 列表镜像
lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天", "太⽩"]
print(lst) # ["太⽩", "太⿊", "五⾊", "银王", "⽇天", "太⽩"]
lst.reverse()
print(lst) # ['太⽩', '⽇天', '银王', '五⾊', '太⿊', '太⽩']
# len
l = len(lst) # 列表的⻓度
print(l)
列表的嵌套
- 采⽤降维操作.⼀层⼀层的看就好. (剥洋葱皮,一层一层来)
lst = [1, "太⽩", "wusir", ["⻢⻁疼", ["可⼝可乐"], "王剑林"]]
# 找到wusir
print(lst[2])
# 找到太⽩和wusir
print(lst[1:3])
# 找到太⽩的⽩字
print(lst[1][1])
# 将wusir拿到. 然后⾸字⺟⼤写. 再扔回去
s = lst[2]
s = s.capitalize()
lst[2] = s
print(lst)
# 简写
lst[2] = lst[2].capitalize()
print(lst)
# 把太⽩换成太⿊
lst[1] = lst[1].replace("⽩", "⿊")
print(lst)
# 把⻢⻁疼换成⻢化疼
lst[3][0] = lst[3][0].replace("⻁", "化")
print(lst[3][0])
lst[3][1].append("雪碧")
print(lst)
元组 (tuple) 和 元组嵌套 (不常用)
-
元组: 俗称不可变的列表.⼜被成为只读列表, 元组也是python的基本数据类型之⼀, ⽤⼩括 号括起来, ⾥⾯可以放任何数据类型的数据, 查询可以. 循环也可以. 切片也可以. 但就是不能改.
-
关于不可变, 注意: 这⾥元组的不可变的意思是⼦元素(第一层元素)不可变. ⽽⼦元素内部的⼦元素是可以变, 这取决于⼦元素是否是可变对象.
-
元组的作用: 在一些配置文件里,防误操作
-
元组中如果只有⼀个元素. ⼀定要添加⼀个逗号, 否则就不是元组
例:
-
空元组表达方式
-
元组也有索引和切片 count(), index(), len()等⽅法. 可以⾃⼰测试使
#元组 tuple
tu = (1, "太⽩", "李⽩", "太⿊", "怎么⿊")
tu = tuple() # 空元组表达方式
tu = (1,) # 单元素元组表达方式 必须加一个"," 隔开
# for循环遍历元组
for el in tu: # el 是 element (元素)的简写
print(el)
# 尝试修改元组
# tu[1] = "⻢⻁疼" # 报错 'tuple' object does not support item assignment
tu = (1, "哈哈", [], "呵呵")
# tu[2] = ["fdsaf"] # 这么改不⾏
tu[2].append("麻花藤") # 可以改了. 没报错
tu[2].append("王剑林")
print(tu)
总结
- 不可变数据类型: int str bool (元组)或(tuple)
range (范围)
- range可以帮我们获取到⼀组数据. 通过for循环能够获取到这些数据.
range (1,10,2) 类似切片 默认step为1
range(10) 默认start 为 0
# range(边界) 从0到这个边界
# range(start, end) 从start到end结束.取不到end
# range(start, end, step) 从start到end. 步长是step
for num in range(10):
print(num)
# range 可以遍历元素集并且有索引
lst = ["张无忌", "张三丰", "张翠山", "张一山", "张磊", "张伟", "张角"]
for el in lst: # 这样循环. 没有索引
print(el)
for i in range(len(lst)): # 有索引了
print(lst[i]) ### 既取到了每个元素,又有索引
tu = ("首页", "登录", "注册", "购物", "退出")
for i in range(len(tu)):
print(i+1,tu[i])
# 1 首页
2 登录
3 注册
4 购物
5 退出
易错题
# 通过对li = [1, 3, 2, "a", 4, "b", 5, "c"]列表的切⽚
形成新的列表l5, l5 = ["c"]
li = [1, 3, 2, "a", 4, "b", 5, "c"]
l5 = li[-1,]
print(l5) # 打印出来的是 "c"
易错分析:
l5 = li[-1]
print(l5) # 打印出来的是 c