7.3 数据类型之列表
7.3 数据类型之列表
- 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
- 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。
- 和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
7.3.1 创建格式:
list1 = [value1,value2,…]
7.3.2 常用功能
# 空列表
empty_list1 = list()
empty_list2 = []
list1 = ['abcd', '1234', '1.234', 'carey']
list2 = [4321, 'dcba']
# 列表截取:
变量[头下标:尾下标:步长]
索引值以 0 为开始值,-1 为从末尾的开始位置。步长为负数表示逆向读取。
print(list1)
# 输出:['abcd', '1234', '1.234', 'carey']
print(list1[0])
# 输出:abcd
print(list1[1:3])
# 输出:['1234', '1.234']
print(list1[2:])
# 输出:['1.234', 'carey']
print(list2 * 2)
# 输出:[4321, 'dcba', 4321, 'dcba']
# 从索引 1 到索引 6 的位置并设置为步长为 2 来截取字符串:
list3 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(list3[1:6:2])
# 输出:['b', 'd', 'f']
# 第三个参数为负数表示逆向读取:
print(list1[::-1])
# 输出:['carey', '1.234', '1234', 'abcd']
#更新
print(list1 + list2)
# ['abcd', '1234', '1.234', 'carey', 4321, 'dcba']
# 列表运算
# '+'
print(list1 + list2)
# 输出:['abcd', '1234', '1.234', 'carey', 4321, 'dcba']
# '*'
print(list2 * 2)
# 输出:[4321, 'dcba', 4321, 'dcba']
# '[]'
print(list1[1])
# 输出:1234
# '[:]'遵循左闭右开原则,str[1:3] 是不包含第 4 个字符的。
print(list1[1:3])
# 输出:['1234', '1.234']
# 'in'
print('1234' in list1)
# 输出:True
# 'not in'
print('1234' not in list1)
# 输出:False
7.3.4 列表的常用方法
列表由 list 类代表,可以使用dir(list)查看该类包含哪些方法
[‘append’, ‘clear’, ‘copy’, ‘count’, ‘extend’, ‘index’, ‘insert’, ‘pop’, ‘remove’, ‘reverse’, ‘sort’]
# append:列表末尾添加新的对象。
list1.append(list2[1])
list1.append('appended')
print(list1)
# 输出:['abcd', '1234', '1.234', 'carey', 'dcba', 'appended']
# clear:清空列表
list1.clear()
print(list1)
# 输出:[]
# copy:浅复制
list4 = list1.copy()
print(list4)
# 输出:[]
# count: 统计某个元素在列表中出现的次数
print(list3.count("a"))
# 输出:1
# extend: 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
list1.extend(list3)
print(list1)
# 输出:['a', 'b', 'c', 'd', 'e', 'f', 'g']
# index: 查询某个元素第一次在列表中索引位置
list1.append('e')
print(list1.index("e"))
# 输出:4
# insert: 查询在特定的索引位置中插入某个元素第
list1.insert(3, 'e')
print(list1.index("e"))
print(list1)
# 输出:3
# 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
print(list1.pop(1))
print(list1)
# 输出:b
# 输出:['a', 'c', 'e', 'd', 'e', 'f', 'g', 'e']
# 移除列表中某个值的第一个匹配项
list1.remove('e')
print(list1)
# 输出:['a', 'c', 'd', 'e', 'f', 'g', 'e']
# 反向列表中元素
list1.reverse()
print(list1)
# 输出:['e', 'g', 'f', 'e', 'd', 'c', 'a']
# 对原列表进行排序
list1.sort()
print(list1)
# 输出:['a', 'c', 'd', 'e', 'e', 'f', 'g']
# 深copy与浅copy的区别
name1 = ['zhangsan', 'lisi', 'wangwu', ['xiaoming', 'pengpeng']]
name2 = name1.copy()
print(name1)
# 输出:['zhangsan', 'lisi', 'wangwu', ['xiaoming', 'pengpeng']]
print(name2)
# 输出:['zhangsan', 'lisi', 'wangwu', ['xiaoming', 'pengpeng']]
name1[1] = '李四'
name1[3][1] = 'carey'
print(name1)
# 输出:['zhangsan', '李四', 'wangwu', ['xiaoming', 'carey']]
print(name2)
# 输出:['zhangsan', 'lisi', 'wangwu', ['xiaoming', 'carey']]
# 虽然后期name1修改了参数,但由于name2是浅copy name1,所以Lisi并没有变为李四,
# 浅copy指的是在copy过程中列表若包含列表、字典等,copy的是内存地址;name1[3][1] = 'carey',是二层复制,修改的是内存地址的内容
# 深copy,重新取一块内存地址进行copy;
import copy
name2 = copy.deepcopy(name1)
print(name1)
# 输出:['zhangsan', '李四', 'wangwu', ['xiaoming', 'carey']]
print(name2)
# 输出:['zhangsan', 'lisi', 'wangwu', ['xiaoming', 'pengpeng']]
注:name2 = name1也是浅copy,修改参数时,新的参数使用的是新的内存地址,旧的地址内容没有发生改变;
7.3.5 列表遍历
>>> list1 = ['zhangsan', 'lisi', 'wangwu', 'xiaoming']
7.3.5.1 直接遍历
>>> for value in list1:
... print(value)
...
zhangsan
lisi
wangwu
xiaoming
>>>
7.3.5.2 索引遍历
>>> for value in range(len(list1)):
... print(list1[value])
...
zhangsan
lisi
wangwu
xiaoming
>>>
7.3.5.3 枚举遍历
>>> for index, value in enumerate(list1):
... print(index, value)
...
0 zhangsan
1 lisi
2 wangwu
3 xiaoming
# 上面所说到的遍历方式非常占用内存,使用迭代器,大大减少内存的使用。
7.3.5.4 列表迭代器
>>> for value in iter(list1):
... print(value)
...
zhangsan
lisi
wangwu
xiaoming
>>>