# 容器类型

# 列表

list1 = [1,2,3,4,5]
list2 = ["a",1,2,"c"]

python 中的 list 可以存储相同 (list1) 或不同的数据 (list2)
列表结构类似于 C++ 的数组,但区别是 python 列表存放的是指针

如果你认真看了第 4 篇,那你应该知道 python 中的变量大部分都是指针

这里有一段代码:

list1 = [1,2,3,4]
list2 = list1
list1.append(5)
print(list2) # 会输出什么?

答案是 [1, 2, 3, 4, 5] , 这里就是 python 的一个坑了,list2 在目标改变后并不会改变指针 (或者说指向 list1 这个目标没有改变)
所以 list1 会与 list2 同步
解决方法就是使用下面的方法:

list1 = [1,2,3,4]
list2 = list1[::] # 在目标列表后加一个 [::]
list1.append(5)
print(list2)

切片同样适用于列表, [::] 表示返回所有内容

list1 = [[1,2],[1,2]]

list1 就是一个 二维列表 ,访问第一个列表的第二个数据需要使用下列方法:

list1[0][1]

# 切片补充

切片可以使用 list[索引] 来返回特定位置的数据
同样可以使用切片来更改数据:

list1 = [1, 2, 3, 4]
list1[0] = 7
print(list1) # [7, 2, 3, 4]
# 更改多个数据
list1 = [1, 2, 3, 4]
list1[0:2] = [7,8]
print(list1) # [7, 8, 3, 4]

更改多个数据等号后必须为可迭代数据
python 的切片含头不含尾

# 成员判断符

在 python 中可以使用 in 来判断元素是否位于目标容器中

list1 = [1,2,3]
if 1 in list1:
    print("yes")
else:
    print("no")
# 输出 yes

# 元组

tuple1=(1,2,3)
tuple2=("a",1,2,"b")

python 中的元组 (tuple) 与 list 基本一致,但元组内的数据不可变
列表基本操作增删改查元组只支持,举个栗子:

tuple1 = (1,2,3)
tuple1[0] = 2
print(tuple1)
# 在第 2 行会报错:TypeError: 'tuple' object does not support item assignment

增删改查的方法会在后面的部分讲到

# 字典

dict1 = {"a":1,"b":2}
print(dict1["a"])

字典是一种哈希结构,查询效率非常高 (接近 O (1))
字典通过键值对来储存对象,像 dict1 中, "a" 对应 1
列表和元组都可以转换为字典
列表转为字典:

list1 = [["a",1],["b",2]]
print(dict(list1)) # {'a': 1, 'b': 2}

二维嵌套列表的 0 位为键,1 位为值
例如第一个键值对中 a 为键, 1 为值

对字典添加或赋值:

dict1 = {"a": 1}
dict1["b"] = 2 # 左侧为键,右侧为值
print(dict1)

# 集合

set1 = {"apple","banana","orange"}
print(set1) # 输出 {'orange', 'banana', 'apple'}

集合是无序、无索引的,不可以执行这个操作

set1 = {3,4,1,2,3,5}
print(set1)

集合会自动对数字进行排序,去除重复项

# 常用方法

# 通用方法

print() input() 控制台的输出 / 入
len() 返回参数的长度 (仅可用于可迭代对象)
max() min() 返回参数的最大 / 小值
str() int()...(对应的类型名称) 把对象转换为对应类型
type() 返回对象类型
del obj 删除对象 (全局命令)

# 容器类型方法

# 列表,元组

元组仅适用于查询

# 增加

append() 在末尾添加一个元素,能且只能添加一个元素
extend() 在末尾添加多个元素,必须以可迭代形式填入
insert() 在指定位置添加一个元素,可迭代元素会以嵌套的形式填入
如果在添加方法内添加本身,会发生什么?

list1 = [1,2,3]
list1.append(list1)
print(list1)
list1 = [1,2,3]
list1.extend(list1)
print(list1)
list1 = [1,2,3]
list1.insert(-1,list1)
print(list1)

输出如下:

[1, 2, 3, [...]]
[1, 2, 3, 1, 2, 3]
[1, 2, [...], 3]

可以看出,extend 会解包列表并填入,而 append 和 insert 会加入 ... 来避免一直添加

这个 ... 别名 Ellipsis, 是 python 里的特殊数据类型

# 删除

remove() 删除列表中的指定,不存在会返回错误
pop() 删除列表中的指定索引 (不指定删除 - 1 位元素), 并返回这个元素
del 对象[索引] 删除指定索引的元素,索引超出列表会报错
clear() 情空整个列表

# 修改

对象[索引] = 变量 修改指定索引的元素
sort() 对列表进行排序

# 查询

index() 返回查询值的索引,不存在会报错
count() 统计固定值的出现次数

# 字典

# 增加,修改

dict[键]=值 对指定对象赋值 (不存在创建新键值对)
update() 使用键值对更新字典

字典和列表的复制一样,需要使用 copy 进行复制

# 删除

pop() 删除指定键的键值对
popitem() 删除最后添加的项目 (3.7 之前会删除随机项目)
del dict[键] 删除指定键的键值对
clear() 清除这个字典

# 查询

get() 获取指定键的值
values() keys() 获取所有的键 / 值
items() 返回所有键值对

# 集合

# 增加

add() 添加一个元素
update() 添加多个元素 (可迭代)

# 删除

remove() 删除列表中的指定,不存在会返回错误
discard() 删除列表中的指定,不会返回错误
pop() 删除并返回随机元素
clear() 清除这个集合

集合只能遍历,无法查询和使用索引