目录
列表的基本使用
# 可以使用[] 来表示一个列表,列表里的每一个数据我们称之为元素
names = ['张三', '李四', '王五']
print(names)
# 可以使用 list(可迭代对象) 将可迭代对象转换成一个列表
names2 = list(('22', '33'))
print(names2)
添加列表元素
- 使用append()方法,在列表末尾添加一个元素
names = ['张三', '李四', '王五']
names.append('索顿')
print(names)
- 使用insert(index, object),index表示下标,在那个位置插入数据。object表示对象,为插入的数据
names = ['张三', '李四', '王五']
names.insert(1, '索顿')
print(names)
- 使用extend(iterable), iterable为可迭代对象。A.extend(B) 将 B 添加到 A的末尾
names = ['张三', '李四', '王五']
name = ['索顿', '阿托']
names.extend(name)
print(names)
删除列表元素
- pop(index)方法,如果不指定index则默认删除最后一个元素
names = ['张三', '李四', '王五', '索顿']
names.pop()
print(names)
names.pop(1)
print(names)
- remove(object),用来删除指定的元素(如果有重复,只会删掉最先出现的元素).如果删除的元素不存在,会出现ValueError
names = ['张三', '李四', '王五', '索顿']
names.remove('王五')
print(names)
- clear(),清空列表
names = ['张三', '李四', '王五', '索顿']
names.clear()
print(names)
列表的查询
- index()方法,如果查找成功,返回元素的下标,如果查找失败,会出现ValueError
names = ['张三', '李四', '王五', '索顿']
print(names.index('王五'))
- count(),返回所查元素在列表中出现的个数
names = ['张三', '李四', '王五', '索顿', '张三']
print(names.count('张三'))
print(names.count('莫甘娜'))
列表元素的修改
- 使用下标可以直接修改列表里的元素
names = ['张三', '李四', '王五', '索顿', '张三']
names[0] = '莫甘娜'
print(names)
交换两个变量
- 使用第三方变量
a = 12
b = 23
c = a
a = b
b = c
print('a= %d b= %d' % (a, b))
- 使用运算符来实现,注意:此方法只适用于 数字
a = 12
b = 23
a = a + b
b = a - b
a = a - b
print('a= %d b= %d' % (a, b))
- 使用异或运算符(异或:两个位相同为0,相异为1 )
a = 12
b = 23
# 注意: a^b^b = a
a = a ^ b
b = a ^ b
a = a ^ b
print('a= %d b= %d' % (a, b))
- 使用python特有的 ,a, b = b, a
a = 12
b = 23
a, b = b, a
print('a= %d b= %d' % (a, b))
列表元素的排序
- sort(),默认为从小到大排序,如果需从大到小排序,需指定参数:reverse=True
list = [4, 0, 9, 1, 12]
list.sort()
print(list)
list.sort(reverse=True)
print(list)
- 使用内置函数sorted()。该函数不会改变原有的数据,而是重新生成一个有序的数据
list1 = [4, 0, 9, 1, 12]
list1 = sorted(list1)
print(list1)
list1 = sorted(list1, reverse=True)
print(list1)
列表数据的反转
- 使用reverse()方法
list1 = [4, 0, 9, 1, 12]
list1.reverse()
print(list1)
- 使用切片的方法,list1[::-1]
list1 = [4, 0, 9, 1, 12]
list1 = list1[::-1]
print(list1)
python里的可变数据类型和不可变数据类型
不可变数据类型:字符串、数字、元组
可变数据类型: 列表、字典、集合
不可变数据类型:如果修改变量的值,会给变量重新分配一块内存地址(使用内置函数 id(Object), 可获取一个变量的内存地址)
可变数据类型: 如果修改变量的值,不会给变量重新分配一块内存地址,还是使用原来的地址
- 不可变数据内型
实例:
a = 10
print("修改前的内存地址:%X" % id(a))
a = 12
print("修改后的内存地址:%X" % id(a))
分析:
- 可变数据类型
实例:
a = [100, 200, 300]
print("修改前的内存地址:%X" % id(a))
a[1] = 250
print("修改后的内存地址:%X" % id(a))
分析:
列表的浅复制(浅拷贝)
- 使用copy()方法
调用copy()方法可以复制一个列表。这个新列表的内容和原列表的内容一样,但是指向不同的内存空间
a = [100, 200, 300]
b = a.copy()
print('a = ', a, '\t', 'b = ', b)
print("a的内存地址:%X b的内存地址:%X" % (id(a), id(b)))
- 使用copy模块的copy()方法
import copy
a = [100, 200, 300]
b = copy.copy(a)
print('a = ', a, '\t', 'b = ', b)
print("a的内存地址:%X b的内存地址:%X" % (id(a), id(b)))
- 使用切片方法。切片其实就是一个浅拷贝
a = [100, 200, 300]
b = a[::]
print('a = ', a, '\t', 'b = ', b)
print("a的内存地址:%X b的内存地址:%X" % (id(a), id(b)))
列表的嵌套
import random
# 一个学校有三个办公室,用程序完成10名老师的随机分配
teachers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
rooms = [[], [], []]
for teacher in teachers:
room = random.choice(rooms)
room.append(teacher)
print(rooms)
# 获取每个办公室老师的数目
for i, room in enumerate(rooms): # enumerate是带下标的遍历
print('房间%d 有%d名老师' % (i, len(room)))
使用列表推导式简单创建一个列表
nums = [i for i in range(10)]
# 相当于
# nums = []
# for i in range(10):
# nums.append(i)
print(nums)
nums2 = [j for j in range(10) if j % 2 == 0]
# 相当于
# nums2 = []
# for j in range(10):
# if j % 2 == 0:
# nums2.append(j)
print(nums2)
浅拷贝和深拷贝
前面所讲的,列表.copy(), copy.copy(列表), 切片都属于浅拷贝。但是如果一个列表里面嵌套有列表,浅拷贝值会复制第一层的列表,对于嵌套的列表并不会复制,它还是存在一个内存空间里
eg:
nums = [1, 2, [3, 4], 5]
nums2 = nums.copy()
# 修改nums嵌套列表的元素值
nums[2][0] = 6
# 修改nums[2][0] 的值,nums2[2][0] 里面的值同样会改变
print('nums2: ', nums2)
由此就需要用深拷贝,深拷贝会拷贝全部
注意:深拷贝只能使用copy模块
import copy
nums = [1, 2, [3, 4], 5]
nums2 = copy.deepcopy(nums)
# 修改nums嵌套列表的元素值
nums[2][0] = 6
# 深拷贝修改nums[2][0] 的值,nums2[2][0] 里面的值不会改变
print('nums: ', nums)
print('nums2: ', nums2)