# 列表(可以被修改)
# 元素赋值、删除元素、切片赋值、使用列表的方法
print(list("Hello")) # ['H', 'e', 'l', 'l', 'o']
# 1. 基本操作
# 1.1 元素赋值
x = [1, 2, 3]
x[1] = 4
print(x) # [1, 4, 3]
# 注:不能给不存在的元素赋值
# 1.2 删除元素
names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
del names[2]
print(names) # ['Alice', 'Beth', 'Dee-Dee', 'Earl']
print(len(names)) # 4
# 1.3 给切片赋值
name = list('Perl')
name[2:] = list('ar')
print(name) # ['P', 'e', 'a', 'r']
# 改变长度
name[1:] = list('ython')
print(name) # ['P', 'y', 't', 'h', 'o', 'n']
# 不替换原有元素,插入新元素
numbers = [1, 5]
numbers[1:1] = [2, 3, 4]
print(numbers) # [1, 2, 3, 4, 5]
# 删除切片
numbers[1:4] = []
print(numbers) # [1, 5]
# 与del numbers[1:4]等效
# 2. 列表方法
# 2.1 append:将一个对象附加到列表末尾
# 它不会返回修改后的新列表,而是直接修改旧列表。
lst = [1, 2, 3]
lst.append(4)
print(lst) # [1, 2, 3, 4]
# 2.2 clear:清空列表
# 等于切片语句:lst[:] = []
lst.clear()
print(lst) # []
# 2.3 copy:复制
# 常规复制只是将另一个名称关联到列表,即指向了同一块内存
a = [1, 2, 3]
b = a
b[1] = 4
print(a) # [1, 4, 3]
# 要使其指向不同的列表,必须将b关联到a的副本
a = [1, 2, 3]
b = a.copy()
b[1] = 4
print(a) # [1, 2, 3]
# 2.4 count:计算指定的元素在列表中出现了多少次
a = ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
print(a) # 2
x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
print(x.count(1)) # 2
print(x.count([1, 2])) # 1
# 2.5 extend:同时将多个值附加到列表末尾
# 注意与常规拼接的区别
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b) # [1, 2, 3, 4, 5, 6]
print(a) # [1, 2, 3]
# 相当于 a[len(a):] = b
a.extend(b)
print(a) # [1, 2, 3, 4, 5, 6]
# 2.6 index:在列表中查找指定值第一次出现的索引
knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
print(knights.index('who')) # 4
# 2.7 insert:将一个对象插入列表
numbers = [1, 2, 3, 5, 6, 7]
numbers.insert(3, 'four')
print(numbers) # [1, 2, 3, 'four', 5, 6, 7]
# 可以使用切片赋值来获得与insert一样的效果
numbers = [1, 2, 3, 5, 6, 7]
numbers[3:3] = ['four']
print(numbers) # [1, 2, 3, 'four', 5, 6, 7]
# 2.8 pop:从列表中删除一个元素(末尾为最后一个元素),并返回这一元素
# 注:pop是唯一既修改列表又返回一个非None值的列表方法。
x = [1, 2, 3]
print(x.pop()) # 3
print(x) # [1, 2]
print(x.pop(0)) # 1
print(x) # [2]
x = [1, 2, 3]
x.append(x.pop())
print(x) # [1, 2, 3]
# 2.9 remove:用于删除第一个为指定值的元素
# 它修改列表,但不返回任何值
x = ['to', 'be', 'or', 'not', 'to', 'be']
x.remove('be')
print(x) # ['to', 'or', 'not', 'to', 'be']
# 2.10 reverse:按相反的顺序排列列表中的元素
x = [1, 2, 3]
x.reverse()
print(x) # [3, 2, 1]
print(x.reverse()) # None
# 2.11 sort:对列表就地排序
x = [4, 6, 2, 1, 7, 9]
x.sort()
print(x) # [1, 2, 4, 6, 7, 9]
print(x.sort()) # None
# 2.12 高级排序.方法sort接受两个可选参数:key和reverse。
# 参数key类似于参数cmp:你将其设置为一个用于排序的函数。
x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
x.sort(key=len)
print(x) # ['add', 'acme', 'aerate', 'abalone', 'aardvark']
# reverse,只需将其指定为一个真值(True或False),以指出是否要按相反的顺序对列表进行排序。
x = [4, 6, 2, 1, 7, 9]
x.sort(reverse=True)
print(x) # [9, 7, 6, 4, 2, 1]