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
>>>
posted @ 2020-05-10 10:16  f_carey  阅读(8)  评论(0编辑  收藏  举报  来源