第4天 | 32天学会python, 数据类型之列表

列表的基本使用

# 当我们有多个数据需要按照一定顺序保存的时候,我们可以考虑列表
# 和字符串一样,都可以使用下标来获取元素和对元素进行切片;同时我们还可以使用下标来修改列表里的元素
# name1 = '张三'
# name2 = '李四'
# name3 = '王五'
# name4 = 'jack'  # 这样写数据多了不现实

# 使用[]来表示一个列表,列表里的每一个数据我们称之为元素,元素之间使用逗号进行分割
名字 = ['张三', '李四', '王五', 'jack', '张飞', '关羽', '马超', '王昭君', '蔡文姬']
print(名字[3])  # jack
名字[3] = '花木兰'
print(名字)  # ['张三', '李四', '王五', '花木兰', '张飞', '关羽', '马超', '王昭君', '蔡文姬']
# list(可迭代对象)
names = list(('兰陵王', '东皇太一','王昭君','程咬金'))
print(names)  # ['兰陵王', '东皇太一', '王昭君', '程咬金']

# 也可以通过下标来实现切片
print(名字[3:9])  # ['花木兰', '张飞', '关羽', '马超', '王昭君', '蔡文姬']

 列表的增删改查

# 列表的操作:增删改查
# 1、增 append  insert extend
heros = ['阿珂', '嬴政', '韩信', '露娜', '后裔', '亚瑟', '李元芳']
heros.append('黄忠')  # 在列表的最最后追加一个数据
print(heros)  # ['阿珂', '嬴政', '韩信', '露娜', '后裔', '亚瑟', '李元芳', '黄忠']

heros.insert(3, '李白')  # 需要两个参数(下标/内容)
print(heros)  # ['阿珂', '嬴政', '韩信', '李白', '露娜', '后裔', '亚瑟', '李元芳', '黄忠']

x = ['马可波罗', '米莱迪', '狄仁杰']
heros.extend(x)  # 参数是可迭代对象
print(heros)  # ['阿珂', '嬴政', '韩信', '李白', '露娜', '后裔', '亚瑟', '李元芳', '黄忠', '马可波罗', '米莱迪', '狄仁杰']

# 2、删 pop remove clear del
masters = ['王昭君', '甄姬', '貂蝉', '妲己', '小乔', '大乔']
print(masters.pop())  # 大乔  删除最后一个,并且返回删除的结果
print(masters)  # ['王昭君', '甄姬', '貂蝉', '妲己', '小乔']
print(masters.pop(3))  # 妲己 可以填下标参数指定删除
print(masters)  # ['王昭君', '甄姬', '貂蝉', '小乔']

masters.remove('小乔')  # 删除指定元素
print(masters)

del masters[2]  # del可以用,最好不要用,它太厉害了
print(masters)  # ['王昭君', '甄姬']

masters.clear()  # 全部删除
print(masters)  # []

# 3、查 index count
tanks = ['亚瑟', '程咬金', '盾山', '张飞', '廉颇', '程咬金']
print(tanks.index('盾山'))  # 2
# print(tanks.index('庄周'))  # 元素不存在报错
print(tanks.count('程咬金'))  # 2 计次
# in 运算符
print('张飞' in tanks)  # True
print('苏烈' in tanks)  # False

# 4、改
tanks[5] = '铠'  # 使用下标修改元素
print(tanks)  # ['亚瑟', '程咬金', '盾山', '张飞', '廉颇', '铠']


 列表的遍历

# 遍历:将所有的数据都访问一遍。遍历针对的是可迭代对象
# for...in循环遍历
刺客 = ['李白', '兰陵王', '韩信', '赵云', '阿珂', '孙悟空']

for 变量 in 刺客:
    print(变量)
# while 循环遍历
计次 = 0
while 计次 < len(刺客):
    print(刺客[计次])
    计次 += 1

交换两个列表的值

# 交换两个变量的值
# 1、使用第三方变量
a = 13
b = 20
c = a
a = b
b = c
print(a)  # 20
print(b)  # 13
# 2、使用加减运算符,只能是数字
红 = 255
蓝 = 389
红 = 红 + 蓝
蓝 = 红 - 蓝  # 此时红(总)减蓝结果是红,红就赋值给了蓝
红 = 红 - 蓝  # 此时红(总)减蓝结果是蓝,因为红赋值给了蓝,减去红就剩下了蓝
print(红)  # 389
print(蓝)  # 255
# 3、使用异或运算符,只能数字
甲 = 23
乙 = 15
甲 = 甲 ^ 乙
print(甲)  # 24
乙 = 甲 ^ 乙
print(乙)  #23
甲 = 甲 ^ 乙
print(甲)  # 15
# 4、python特有
丙 = '我爱你'
乙 = '你爱我'
丙,乙 = 乙,丙
print(丙)  # 你爱我
print(乙)  # 我爱你

 冒泡算法

# 冒泡排序思想:让一个数字和它相邻的下一个数字进行比较运算;如果前一个数字大于后一个数字,交换两个数据的位置
数 = [6,5,3,1,8,7,2,4]
乙 = 0
比较次数 = 0

while 乙 < len(数)-1:
    甲 = 0
    判断比较 = True
    while 甲 < len(数)-1-乙:
        比较次数 += 1
        if 数[甲] > 数[甲+1]:
            判断比较 = False  # 这一轮只要交换了元素,就是False;如果这一轮没有进来交换元素,就是True
            数[甲],数[甲+1]= 数[甲+1],数[甲]
        甲 +=1
    if 判断比较: #如果是True就结束外循环,优化总躺数
        break
    乙 += 1

print(数)
print('比较了{}次'.format(比较次数))

列表的排序和反转

甲 = [6,5,3,1,8,7,2,4]
# 调用列表的sort方法可以直接对列表进行排序
甲.sort()
print(甲)  # [1, 2, 3, 4, 5, 6, 7, 8]

# 列表的排序反转
甲.sort(reverse=True)
print(甲)  # [8, 7, 6, 5, 4, 3, 2, 1]

# 内置函数sorted,不会改变原有的列表数据,会生成一个新的有序数据
乙 = sorted(甲)
print(乙)  # [1, 2, 3, 4, 5, 6, 7, 8]

# reverse 内置函数
名字 = ['张三', '李四', '王五']
名字.reverse()  # 反转排序
print(名字)  # ['王五', '李四', '张三']

列表的拷贝(浅复制) 

import copy

x = [100, 200, 300]  # x和y指向了同一个内存空间,会互相影响
y = x  # 等号是内存地址的赋值,如果修改x,y的数据同步会改变
# 浅复制(拷贝)
# 1、调用copy方法,可以复制一个列表;这个新的列表内容一样,但是指向不同的内存空间
z = x.copy()
x[0] = 1
print(y)  # [1, 200, 300]
print(z)  # [100, 200, 300]  # 拷贝的 不会受修改原列表元素而改变

# 2、调用copy模块
甲 = ['不知火舞', '刘备', '贾宝玉', '孙悟空']
乙 = copy.copy(甲)  # 效果等价于x.copy()方法,都是一个浅拷贝
甲[2] = '宋江'
print(乙)  # ['不知火舞', '刘备', '贾宝玉', '孙悟空']

# 3、切片方法实现复制
丙 = ['丁义珍','高育良','李达康','侯亮平','陆亦可','赵东来','祁同伟']
丁 = 丙[::]
丙 [6] = '沙瑞金'
print(丙)  # ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '赵东来', '沙瑞金']
print(丁)  # ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '赵东来', '祁同伟']

赋值是同一个内存,拷贝是一块新的内存空间

删除列表中的空字符 

# 1、for...in循环遍历列表时,最好不要对元素进行增删操作;因为删除一个元素后,元素总数变化了下一轮循环可能出错
演员 = ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '', '','赵东来', '祁同伟','']
for 取值 in 演员:
    if 取值 == '':
        演员.remove(取值)
演员.remove('')  # 因为上面循环删除时演员元素总和动态变化,所以会漏删一个需要再删一次
print(演员)  # ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '赵东来', '祁同伟']

# 2、while循环遍历实现
演员 = ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '', '','赵东来', '祁同伟','']
索引 = 0
while 索引 < len(演员):
    if 演员[索引] == '':
        演员.remove('')
        索引 -= 1
    索引 +=1
print(演员)  # ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '赵东来', '祁同伟']

# 3、赋值法
演员 = ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '', '','赵东来', '祁同伟','']
演员2 = []
for 遍历 in 演员:
    if 遍历 != '':
        演员2.append(遍历)
演员 = 演员2
print(演员)  # ['丁义珍', '高育良', '李达康', '侯亮平', '陆亦可', '赵东来', '祁同伟']


 列表的嵌套

# 一个学校,有3个办公室,现在有10位老师等待工位的分配,请编写程序,完成随机的分配
import random

teachers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
rooms = [[],[],[]]
for 老师 in teachers:
    room =random.choice(rooms)  # choice 从列表里随机选择一个数据
    room.append(老师)
print(rooms) # [['A', 'F', 'G'], ['B', 'E'], ['C', 'D', 'H', 'I', 'J']]

# 打印每个房间有多少老师
房间号 = 101
for 老师数量 in rooms:
    print('{}号办公司有{}个老师!'.format(房间号, len(老师数量)))
    房间号+=1
# 101号办公司有3个老师!
# 102号办公司有2个老师!
# 103号办公司有5个老师!

# for循环也可以带下标
for 下标,老师数量2 in enumerate(rooms):
    print('房间{}里有{}位老师!'.format(下标, len(老师数量2)),'分别是',老师数量2)
# 房间0里有3位老师! 分别是 ['A', 'F', 'G']
# 房间1里有2位老师! 分别是 ['B', 'E']
# 房间2里有5位老师! 分别是 ['C', 'D', 'H', 'I', 'J']


列表推导式 

# 列表推导式作用是使用简单的语法创建一个列表
列表 = [i for i in range(10)]  # range有3个参数,前两个是个范围,第三个是步进值
print(列表)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 上面的简洁语法等价于下面规范语法:
列表 = []
for i in range(10):
    列表.append(i)
print(列表)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 还能加if判断哦
列表1 = [x for x in range(10) if x % 2 ==0]
print(列表1)  # [0, 2, 4, 6, 8]
# 上面简洁语法等价于下面规范语法:
列表1 = []
for x in range(10):
    if x % 2:  # 如果x % 2 ==0结果和上面一样了,而x % 2的话如果x是偶数余数就是0,0转换成布尔值是False
        列表1.append(x)
print(列表1)  # [1, 3, 5, 7, 9]

# points 是一个列表.这个列表里的元素都是元组
points = [(x,y) for x in range(5,9) for y in range(10,20)]
print(points)  # [(5, 10), (5, 11), (5, 12), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 18),
# (5, 19), (6, 10), (6, 11), (6, 12), (6, 13), (6, 14), (6, 15), (6, 16), (6, 17), (6, 18), (6, 19),
# (7, 10), (7, 11), (7, 12), (7, 13), (7, 14), (7, 15), (7, 16), (7, 17), (7, 18), (7, 19), (8, 10),
# (8, 11), (8, 12), (8, 13), (8, 14), (8, 15), (8, 16), (8, 17), (8, 18), (8, 19)]


列表的浅拷贝和深拷贝 

# 浅复制(拷贝)
import copy

nums = [1, 2, 3, 4, 5, ]
nums1 = nums  # 深拷贝/浅拷贝??都不是,是一个指向,是赋值
print(nums1)  # [1, 2, 3, 4, 5]

nums2 = nums.copy()  # 浅拷贝,两个内容一模一样,但是不是同一个对象

nums3 = copy.copy(nums)  # 和nums.copy()功能一致,都是浅拷贝

# 深拷贝---只能使用copy模块实现
words = ['hello', 'good', [100, 200, 300], 'yes', 'in', 'ok']

# words1是words的浅拷贝;浅拷贝可以说是只拷贝了一层
words1 = words.copy()

words[0] = '你好' # 拷贝之后修改words的'hello'变成'你好';但是下面words1不会跟着变,这是浅拷贝
print(words1)  # ['hello', 'good', [100, 200, 300], 'yes', 'in', 'ok']

words[2][0] = 1  # 拷贝之后修改words的[100,200,300]中的100变成1,这时浅拷贝就不行了,它只能拷贝一层;这时候需要深拷贝了
print(words1)  # ['hello', 'good', [1, 200, 300], 'yes', 'in', 'ok']

# words2是words的深拷贝
words = ['hello', 'good', [100, 200, 300], 'yes', 'in', 'ok']
words2 = copy.deepcopy(words)
words[2][0] = 1  # 使用深拷贝即使修改了第二层的元素,深拷贝的数据也不会变
print(words2)  # ['hello', 'good', [100, 200, 300], 'yes', 'in', 'ok']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值