python06 列表

本文详细介绍了Python列表的使用,包括列表的简介、基本操作(如添加、删除、修改和查询元素)、遍历方式、交换变量、排序与反转、可变与不可变数据类型的区别、列表的复制(浅拷贝与深拷贝)和嵌套,以及列表推导式的应用。通过实例练习加深理解,如添加元素、冒泡排序、找最大数、删除空字符串和随机分配等。
摘要由CSDN通过智能技术生成

1、列表的基本使用

(1)列表的简介

  • 当我们有多个数据需要按照一定的顺序保存的时候,我们可以考虑使用列表
  • 表达方式:
    • # 列表的表示方式之一:
      names = ['names1','names2','names3','names4']

      使用 [ ] 来表示一个列表,列表中的每一个数据我们称之为元素,元素和元素之间使用逗号进行分割

    • # 列表的表示方式之二:
      names = list(('names1','names2','names3','names4'))

      使用 list(可迭代对象),将可迭代对象转换为一个列表

  • 下标和切片
    • 和字符串一样,都可以使用下标来获取元素和对元素进行切片表里的元素
      • # 下标
        print(names[3])
        names[3] = 'hh'
        print(names)
        # ['names1', 'names2', 'names3', 'hh']
        
        # 切片
        print(names[2:7])
        # ['names3', 'hh']

        我们还可以使用下标来修改列

(2)列表的基本操作

  • 列表是用来保存多个数据的,是有序可变的
    • 操作列表,一般都包含增加数据,删除数据,修改数据以及查询数据
  • 添加元素
  • append 在末尾添加元素
  • insert(index ,object) 在指定位置插入元素
    • 参数:
      • index 下标 : 在哪个位置插入数据
      • object 对象 :具体插入哪个数据
  • extend 合并两个列表
    • A.extend(B) --- 将可迭代对象 B 添加到 A 中
name = ['names 1','names 2','names 3','names 4']
# append 在末尾添加元素
name.append('names 5')
# ['names 1', 'names 2', 'names 3', 'names 4', 'names 5']

# insert(index ,object) 在指定位置插入元素
name.insert(3,'names 0')
# ['names 1', 'names 2', 'names 3', 'names 0', 'names 4', 'names 5']

# extend 合并两个列表
#   A.extend(B) --- 将可迭代对象 B 添加到 A 中
x = ['n1','n2','n3','n4']
name.extend(x)
# ['names 1', 'names 2', 'names 3', 'names 0', 'names 4', 'names 5', 
    'n1', 'n2', 'n3', 'n4']

print(name)
  • 删除、修改和查询
    • 删除数据
      • pop 方法会删除列表里最后一个数据,并返回被删除的数据
        • 还可以传入指定的index 参数,用来删除指定位置上的数据
      • remove 删除指定的元素
        • 如果数据在列表中不存在,会报错
      • clear 用来清空一个列表
      • 使用 del 也可以删除一个数据
    • 查询数据
      • 使用 index 方法来查询
      • 使用 in 运算符来查询
    • 修改元素
      • 使用下标可以直接修改列表里的元素
# 删除数据
m = ['a1','a2','a3','a4','a5']
# pop 方法会删除列表里最后一个数据,并返回被删除的数据
a = m.pop()
b = m.pop(3)
print(a) # a5
print(b) # a4
print(m) # ['a1', 'a2', 'a3']

# remove 删除指定的元素
m.remove('a1')
print(m) # ['a2', 'a3', 'a4', 'a5']

# clear 用来清空一个列表
m.clear()
print(m) # []

# 使用 del 也可以删除一个数据
del m[2]
print(m) # ['a1', 'a2', 'a4', 'a5']


# 查询数据
m = ['a1','a2','a3','a4','a5']
# 使用 index 方法来查询
print(m.index('a1')) # 0
print(m.index('a9')) # 如果元素不存在会直接报错

# 使用 in 运算符来查询
print('a1' in m) # True
print('a9' in m) # False


# 修改元素:使用下标可以直接修改列表里的元素
m[2] = 'a00'
print(m) # ['a1', 'a2', 'a00', 'a4', 'a5']

2、遍历列表

(1)遍历的简介

  • 将所有的数据都访问一遍
  • 遍历针对的是可迭代对象

(2)遍历的方式

  • while 循环
  • for……in 循环
  • x = ['x1','x2','x3','x4','x5']
    
    # for……in 循环的本质就是不断的调用迭代器的 next 方法查找下一个数据
    for k in x :
        print(k)
    # x1
    # x2
    # x3
    # x4
    # x5
    
    # while 循环
    i = 0
    while i < len(x):
        print(x[i])
        i += 1
    # x1
    # x2
    # x3
    # x4
    # x5

3、交换两个变量的值

a = 13
b = 20

# 方法1:使用第三方变量来实现
c = b # 此时的b如何变动,c都不会跟着一起变动
b = a
a = c
print(a) # 20
print(b) # 13

# 方法2:使用运算符来实现,只能是数字
a = a + b
b = a - b
a = a - b
print(a) # 20
print(b) # 13

# 方法3:使用异或运算符
a = a ^ b
b = a ^ b
a = a ^ b
print(a) # 20
print(b) # 13
# 用法:a^b^b == a

# 方法4:使用python里面特有的
a, b = b, a
print(a) # 20
print(b) # 13

4、列表的排序和反转

  • 调用列表的 sort 方法可以直接对原有的列表进行排序
  • 使用内置函数 sorted 进行排序,不会改变原有的列表数据,而是会生成新的有序数据
  • 使用 reverse 方法进行反转排序
nums = [6, 5, 3, 1, 8, 7, 2, 4, 9]

# 调用列表的 sort 方法可以直接对列表进行排序
# 直接对原有的列表进行排序
nums.sort()
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
nums.sort(reverse=True)
# 这里的 reverse 是在 sort 中传了一个参数
# [9, 8, 7, 6, 5, 4, 3, 2, 1]

# 使用内置函数 sorted 进行排序,不会改变原有的列表数据,而是会生成新的有序数据
x = sorted(nums)
print(x)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums)
# [6, 5, 3, 1, 8, 7, 2, 4, 9]

# 使用 reverse 方法进行反转排序
nums = ['a1','a2','a3']
nums.reverse()
print(nums)
# ['a3', 'a2', 'a1']
# 也可以使用切片 [::-1]

5、可变数据类型和不可变数据类型

(1)简介

  • python里面的数据都是保存到内存里面的
  • python里的数据又分为可变数据类型和不可变数据类型

(2)分类

  • 使用内置函数 id 可以获取到数据的内存地址
  • 不可变数据类型:
    • 字符串
    • 数字
    • 元组
  • 可变数据类型:
    • 列表
    • 字典
    • 集合

(3)不可变数据类型

  • 不可变数据类型:如果修改值,内存地址会发生变化
    • a = 12
      b = a
      print('修改前,a={},b={}'.format(id(a),id(b)))
      # print('修改前,a=%X,b=%X' %(id(a), id(b)))
      # 修改前,a=140726613837824,b=140726613837824
      a = 10
      print(b)
      print('修改后,a={},b={}'.format(id(a),id(b)))
      # 修改后,a=140726613837760,b=140726613837824

(4)可变数据类型

  • 可变数据类型:如果修改值,内存地址不会发生变化
  • nums1 = [100,200,300]
    nums2 = nums1
    print('修改前,nums1=%X,nums2=%X' % (id(nums1), id(nums2)))
    # 修改前,nums1=233E0731500,nums2=233E0731500
    nums1[0] = 1
    print('修改后,nums1=%X,nums2=%X' % (id(nums1), id(nums2)))
    # 修改后,nums1=22CD71F1500,nums2=22CD71F1500

6、列表的复制和嵌套

(1)列表的复制

x = [100,200,300]
y = x # 等号是内存地址的赋值
# x 和 y 指向了同一个内存空间,会相互影响

# 调用 copy 方法,可以复制一个列表
#   这个新列表和原有的列表内容一样,但是指向不同的内存空间
z = x.copy()
print(z)
# [100, 200, 300]

x[0] = 1
print('x=', x, 'y=', y , 'z=', z)
# x= [1, 200, 300] y= [1, 200, 300] z= [100, 200, 300]
print('x=%X,y=%X,z=%X' % (id(x), id(y),id(z)))
# x=1FFE9951500,y=1FFE9951500,z=1FFE9993DC0
  • 浅复制(浅拷贝)
    • import copy
      a = copy.copy(x) # 效果等价于 x.copy(),都是浅拷贝
      
      # 切片其实就是一个浅拷贝
      # 内容一样,只是生成了两个新的地址
      names = ["names1","names2","names3"]
      names2 = names[::]
      names[0] = 'name99'
      print(names2)
      # ['names1', 'names2', 'names3']

(2)列表的嵌套

  • 列表里面可以重复套用列表
    • [1,2,3,4,[22,33,44,55],6]

7、列表推导式的使用

  • 列表推导式作用
# 一般写法:
nums = []
for i in range(10):
    nums.append(i)
print(nums)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 简单语法写法:
nums = [i for i in range(10)]
print(nums)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用简单的语法来创建一个列表

  • 应用
nums = [i for i in range(10) if i%2]
print(nums)
# 转换
nums = []
for i in range(10):
    if i % 2: 
    # 这里有隐式转换:假设i=6,6%2为0,0转换为布尔值为False,不会执行里面的代码块
        nums.append(i)
print(nums)

c = [(x,y) for x in range(5,9) for y in range(10,20)]
# c 是一个列表,这个列表里的元素都是元组
print(c)

8、深拷贝和浅拷贝

nums = [1,2,3,4,5]
nums1 = nums

# 既不是深拷贝也不是浅拷贝,而是一个指向,是赋值

  • 浅复制
import copy
nums = [1,2,3,4,5]
nums2 = nums.copy()
# 浅拷贝,两个内容一摸一样,但是不是同一个对象
nums3 = copy.copy(nums)
# 和 nums.copy() 功能一样,都是浅拷贝
  • 深拷贝
    • 只能使用copy模块实现
q = ['1','2','3',['e','v','g'],'8','9']
q1 = q.copy()
# 此时为浅拷贝
#   浅拷贝只拷贝一层,当里面还有一层的时候,就是指向了里面的那一层
#     此时拷贝出来的也指向了那一层,如果改变里层,那么就都会改变
q[0] = 'dddd'
print(q1)
# ['1', '2', '3', ['e', 'v', 'g'], '8', '9']
q[3][0] = 1
print(q1)
# ['1', '2', '3', [1, 'v', 'g'], '8', '9']

q = ['1','2','3',['e','v','g'],'8','9']
# 深拷贝
#   完全拷贝
q2 = copy.deepcopy(q)
q[3][0] = 1
print(q2)
# ['1', '2', '3', ['e', 'v', 'g'], '8', '9']
print(q)
# ['1', '2', '3', [1, 'v', 'g'], '8', '9']

思维导图:

 

  • 练习1
    • 有一个列表names,保存了一组姓名 names=['names1','names2','names3','names4']
    • 再让用户输入一个姓名,如果这个姓名在列表中存在,提示用户姓名已存在
    • 如果这个姓名在列表中不存在,就将这个姓名添加到列表里
names = ['names1','names2','names3','names4']
username = input('请输入名字:')
# 使用 if 语句
if username in names:
    print("用户名已存在。")
else:
    names.append(username)

# 使用遍历
for name in names:
    if username == name:
        print('用户名已存在。')
        break
else:
    names.append(username)
print(names)
  • 练习2
    • 冒泡
    • 冒泡排序思想:
      • 让一个数字和它相邻的下一个数字进行比较运算
      • 如果前一个数字大于后一个数字,则交换两个数的位置
      • 此时,最大的数就在最后了
nums = [6, 5, 3, 1, 8, 7, 2, 4]
count = 0
i = 0
# 第一趟比较时,多比较了0次,i = 0
# 第二趟比较时,多比较了1次,i = 1
# 第三趟比较时,多比较了2次,i = 2
# 趟数由 i 控制,次数由 n 控制
while i < len(nums) - 1:
    # 在每一趟里面都定义一个flag
    flag = True # 假设每一趟都没有换行
    n = 0
    # 以下循环就是将大的数往后移
    while n < len(nums) - 1 - i:
        count += 1
        # print(nums[n], nums[n+1])
        if nums[n] > nums[n+1]:
            # 只要交换了,假设就不成立
            flag = False
            nums[n], nums[n + 1] = nums[n+1], nums[n]
        n += 1
    if flag:
        # 这一趟走完以后,flag依然是True,说明这一趟没有进行数据交换
        break
    i += 1
print(nums) # [5, 3, 1, 6, 7, 2, 4, 8]
# 外层循环出来的结果,按从小到大的排序
print('比较了%d次'% count)
  • 练习3 :求列表里的最大数
nums = [3, 1, 9, 8, 4, 2, 0, 7, 5]
# 方法1
# 先升序,后提取最后一个
nums.sort()
print(nums[-1])

# 方法2
# 先降序,后提取第一个
nums.sort(reverse=True)
print(nums[0])

# 方法3
# 不排序,直接找
# 思想:假设一个数是0,将假设的数和列表的进行对比,一旦列表的数大于假设的数就提取
#   但是,此时可能出现你假设的数比要比较的数都大
#     所以一般都是直接用列表里面的数进行比较

x = nums[0] # 假设最大的数是第1个(索引0)
for num in nums:
    if num > x:
        # 如果发现列表里面存在比假设还要大的数字,说明假设不存在
        # 此时应该把假设的值替换为被发现的值
        x = num
# 使用自带的 index 方法来获取下标
print('发现的最大数是:%d,它的下标是%d' % (x, nums.index(x)))

x = nums[0]
index = 0
i = 0
while i < len(nums):
    if nums[i] > x:
        x = nums[i]
        index = i
    i += 1
# print('发现的最大数是:%d,它的下标是%d' % (x, index))
  • 练习4 :删除列表里的空字符串
xs = ['h1','h2','','','h4','h5','']

# 方法1
# 在使用 for……in 循环遍历列表时,最好不要对元素进行增删操作
for x in xs:
    if x == '':
        xs.remove(x)
print(xs)
# ['h1', 'h2', 'h4', 'h5', '']
# 在删掉之后,就不再看删掉的位置的值了(下标问题)
#   但是值被删掉后,后面的值会向前挤,此时就会漏掉删掉位置的新值

# 方法2
i = 0
while i < len(xs):
    if xs[i] == '':
        xs.remove(xs[i])
        i -= 1 # 为了返回原先的位置,再对比一遍
    i += 1 # 向前检查
print(xs)
# ['h1', 'h2', 'h4', 'h5']

# 方法3
xs2 = [] # 创建一个空列表
for x in xs:
    if x != '':
        xs2.append(x) # 把不是空字符串的值添加进空列表里面
xs = xs2 # 用新列表把原先的列表替换掉
print(xs)
  • 练习5 :一个学校有3个办公室,现在有8位老师等待工位的分配,编写程序,随机分配
!import random
teachers = ['1','2','3','4','5','6','7','8']
rooms = [[],[],[]]

for teacher in teachers:
    room = random.choice(rooms) # choice 从列表中随机选择一个数据
    room.append(teacher)
print(rooms)

# 第0个房间有几个人,分别是……
# for room in rooms:
#     print('房间里一共有%d个老师' % len(room))

# 带下标的我们一般使用 while
# for 循环也可以带下标
for i, room in enumerate(rooms):
    print('房间%d里一共有%d个老师' % (i,len(room)))
    for teacher in room:
        print(teacher,end=' ')
    print()
  • 练习6
    • 请写出一段 python 代码实现分组一个 list 里面的元素,比如[1,2,3,……100]变成[[1,2,3],
[5,6,7]……]
m = [i for i in range(1,101)]
print(m)
# m[0:3]  j ==> 0
# m[3:6]  j ==> 3
# m[6:9]  j ==> 6
n = [m[j:j + 3] for j in range(0,100,3)]
print(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值