五、列表(list)

1、列表的介绍

列表:列表是Python的基础数据类型之⼀ ,其他编程语⾔也有类似的数据类型. 比如JS中的数
组, java中的数组等等. 它是以[ ]括起来, 每个元素⽤’ , '隔开⽽且可以存放各种数据类型:

例:

lst = ["嘿嘿", "吼吼", ["我是", "列表"], ("I'm", "tuple"), {"dict": "我是字典"}, {"set", "我是集合呀"}, 2]

列表相比于字符串可以存取更多类型的数据,而且可以存放大量的数据。列表是有序的,可以通过索引对列表进行切片取值等操作。

2、列表的索引和切片

列表和字符串一样拥有索引

lst = ["孙悟空", "猪八戒", "沙僧", "唐僧"]
print(lst[0])       # 孙悟空
print(lst[1])       # 猪八戒
print(lst[2])       # 沙僧
print(lst[3])       # 唐僧

lst[0] = "齐天大圣"     # 注意:列表是可变类型,可以直接发生改变,和字符串不一样哈
print(lst)      # ["齐天大圣", "猪八戒", "沙僧", "唐僧"]
temp = "天蓬元帅"
temp[0] = "地"
print(temp)     # TypeError: 'str' object does not support item assignment (不可变类型)

列表的切片

lst = ["孙悟空", "猪八戒", "沙僧", "唐僧"]
print(lst[0:2])     # ["孙悟空", "猪八戒", "沙僧"]
print(lst[::2])     # ["孙悟空", "沙僧"]
print(lst[::-1])    # ['唐僧', '沙僧', '猪八戒', '孙悟空']
print(lst[-1:1:-1]) # ["唐僧", "沙僧"]

3、列表的增删该查

注意:列表是可变类型,所以可以直接对列表中的元素进行操作。

lst = ["name", "age", "job", "hobby"]
lst.append("gender")
print(lst)       # ["name", "age", "job", "hobby", "gender"]

lst = ["name", "age", "job", "hobby"]
lst.insert(1, "gender")
print(lst)       # ["name", "gneder", "age", "job", "hobby"]  按照索引进行插入

lst = ["name", "age", "job", "hobby"]
lst.extend(["gender", "salary"])
print(lst)       # ["name", "age", "job", "hobby", "gender", "salary"]  将可迭代对象进行迭代添加
lst = ["name", "age", "job", "hobby"]
lst.extend("hello")
print(lst)       # ['name', 'age', 'job', 'hobby', 'h', 'e', 'l', 'l', 'o']

lst = ["鬼剑士", "神枪手", "召唤师", "圣职者", "格斗家"]
ret1 = lst.pop()     # 默认删除列表最后一个元素,并且可以取得被删除的元素的值
ret2 = lst.pop(1)        # 也可以指定索引删除
print(ret1)      # 格斗家
print(ret2)      # 神枪手
print(lst)       # ["鬼剑士", "召唤师", "圣职者"]

lst = ["鬼剑士", "神枪手", "召唤师", "圣职者", "格斗家"]
lst.remove("圣职者")        # 指定列表中的元素名称进行删除,删除不存在的元素会报错
print(lst)       # ["鬼剑士", "神枪手", "召唤师", 格斗家"]

lst = ["鬼剑士", "神枪手", "召唤师", "圣职者", "格斗家"]
del lst[2]       # 使用del删除指定的列表元素,只能使用索引或者切片进行删除
print(lst)       # ["鬼剑士", "神枪手",  "圣职者", "格斗家"]

lst = ["鬼剑士", "神枪手", "召唤师", "圣职者", "格斗家"]
lst.clear()      # 清空列表
print(lst)       # []

lst = ["马云", "马化腾", "马良", "马蓉", "马克思"]
lst[1] = "麻花藤"
print(lst)       # ["马云", "麻花藤", "马良", "马蓉", "马克思"]

lst = ["马云", "马化腾", "马良", "马蓉", "马克思"]
lst[1:4] = "hello"
print(lst)       # ["马云", "h", "e", "l", "l", "o", "马克思"]

列表是一个可迭代对象,所以可以使用for循环查询

for ele in list:
 print(i)

其它操作

# 计算"行者孙"在列表中出现的次数
lst = ["孙行者", "行者孙", "者行孙", "行者孙"]
print(lst.count("行者孙"))      # 2

# 计算列表的长度
lst = ["孙行者", "行者孙", "者行孙", "行者孙"]
print(len(lst))      # 4

# 对列表元素进行翻转
lst = ["孙行者", "行者孙", "者行孙", "行者孙"]
lst.reverse()
print(lst)   # ["行者孙", "者行孙", "行者孙", "孙行者"]

# 对列表进行排序
lst = [10,2,45,64,4,16,8]
lst.sort()       # 默认从小到大排序
print(lst)       # [2, 4, 8, 10, 16, 45, 64] 

lst.sort(reverse=True)   # 加上参数reverse=True变成从大到小排序
print(lst2)      # [64, 45, 16, 10, 8, 4, 2]

列表的嵌套

lst = [1, "夸父", "dogfa", ["jack ma", ["康帅博"], "麻辣干子"]]
# 找到"夸父"
print(lst[1])

# 找到“夸父“和”dogfa”
print(lst[1:3])

# 将"夸父“替换成”夸母”
lst[1] = lst[1].replace("父", "母")
print(lst)

# 将”jack ma“各个首字母大写
lst[3][0] = lst[3][0].title()
print(lst)

# 将”康帅博“替换成”康师傅“
lst[3][1][0] = lst[3][1][0].replace("帅博", "师傅")
print(lst)

# 将”dogfa“首字母大写
lst[2] = lst[2].capitalize()
print(lst)

循环删除列表中的元素(注意)

lst = ["鬼剑士", "神枪手", "召唤师", "圣职者", "格斗家"]
for  i in lst:
    lst.remove(i)
print(lst)      # ['神枪手', '圣职者']
# 为什么我们进行for循环时没有将列表中的元素全部删除?因为for循环每循环一次内部索引会加1,而删除了列表中的元素之后,后面的元素会前移,导致删除错乱。
# 第一次循环: ["神枪手", "召唤师", "圣职者", "格斗家"] 删除索引0对应的元素,后面的元素前移
# 第二次循环: ["神枪手", "圣职者", "格斗家"] 删除索引1对应的元素,后面的元素前移
# 第三次循环: ["神枪手", "圣职者"] 删除索引2对应的元素,后面的元素前移

# 解决办法1
for i in range(len(lst)):
    lst.pop()
print(lst)      # []

# 解决办法2
lst2 = []
for i in lst:
    lst2.append(i)
    
for el in lst2:
    lst.remove(el)
print(lst)      # []

六、元祖(tuple)

元组: 俗称不可变的列表.⼜被成为只读列表, 元组也是python的基本数据类型之⼀, ⽤⼩括
号括起来, ⾥⾯可以放任何数据类型的数据, 查询可以. 循环也可以. 切片也可以. 但就是不能
改.

tu = ("name", "age", "gender")
print(tu)       # ("name", "age", "gender")
print(tu[0])    # name
print(tu[2])    # gender
print(tu[0:2])  # 元祖切片之后还是元祖

# for循环遍历元祖
for ele in tu:
    print(ele)
    
# 尝试修改元祖
tu[0] = "我就是要改变你"   # TypeError: 'tuple' object does not support item assignment (元祖中的元素不支持被修改)

# 再次尝试修改元祖
tu = ("你改不了我的", [], "你也改不了我的", "我们中出了一个叛徒")
tu[1] = "我是叛徒"  # 再次修改失败
tu[1].append("我是叛徒")        # 修改成功
print(tu)   # ("你改不了我的", ["我是叛徒"], "你也改不了我的", "我们中出了一个叛徒")

# 通过以上结论,我们可以得出:元祖的不可变指的是元祖内的子元素不可变,而子元素的子元素可不可变取决于是否是可变类型的对象。
# 注意:当元祖中只有一个元素时,必须在元素后面加上一个逗号,否则就不是元祖,例:tu = ("name",)
# 元祖同样含有len(), index(), count()方法。

未完待续