当前位置:   article > 正文

Python之第六章 内置容器 --- 列表(2)_头歌平台python列表推导式

头歌平台python列表推导式

目录

Python之第六章 内置容器 --- 列表(2)

1.列表元素的添加和删除

2.列表元素统计

3.列表的排序

排序归类

4.列表的查找

5.列表逆置(颠倒顺序)

6.列表的元素组合

7.列表的浅拷贝与深拷贝

        列表之间的赋值

浅拷贝

深拷贝

8.列表的推导式

根据就列表生成指定新列表

从旧列表中选择符合条件的元素组成新列表

9.程序实例


Python之第六章 内置容器 --- 列表(2)

1.列表元素的添加和删除

        添加元素 --- listname.append(obj)

        例1 将值为奇数、索引为偶数的元素存储到另一个列表中

  1. # 例1 将值为奇数、索引为偶数的元素存储到另一个列表中
  2. import random
  3. t1 = random.sample(range(10, 30), 10)
  4. t2 = []
  5. print(t1)
  6. for index, item in enumerate(t1):
  7.    if item % 2 == 0 and index % 2 == 1:
  8.        t2.append(item)
  9. print(t2)
  10. 结果
  11. [14, 24, 18, 15, 17, 25, 19, 21, 13, 12]
  12. [24, 12]

        删除元素 --- 根据索引删除 --- del listnname[index]

                       --- 根据内容删除 --- listname.remove(下标)

        例2 删除指定元素

  1. #方法一
  2. import random
  3. t1 = random.sample(range(10, 30), 10)
  4. print(t1)
  5. n = int(input('请输入需要删除的元素的值'))
  6. for i in t1:
  7.    if i == n:
  8.        t1.remove(i)
  9. print(t1)
  10. 结果:
  11. [23, 26, 18, 21, 10, 22, 25, 15, 13, 16]
  12. 请输入需要删除的元素的值10
  13. [23, 26, 18, 21, 22, 25, 15, 13, 16]
  14. #方法二
  15. import random
  16. t1 = random.sample(range(10, 30), 10)
  17. print(t1)
  18. n = int(input('请输入需要删除的元素的值'))
  19. t1.remove(n)
  20. print(t1)
  21. 结果:
  22. [28, 18, 12, 25, 26, 24, 14, 23, 29, 27]
  23. 请输入需要删除的元素的值12
  24. [28, 18, 25, 26, 24, 14, 23, 29, 27]

2.列表元素统计

        格式 --- listname.count(obj)

        作用 --- 获取元素在列表中的出现的次数,只能精确匹配

        注意 --- count()方法一般与remove()方法配合使用,即删除前先统计元素是否存在

        例:

  1. #完善1中的例2
  2. import random
  3. t1 = random.sample(range(10, 30), 10)
  4. print(t1)
  5. n = int(input('请输入需要删除的元素的值'))
  6. if t1.count(n) > 0:
  7.    t1.remove(n)
  8.    print(t1)
  9. else:
  10.    print('请输入的元素不在列表中')
  11. 结果:
  12. [13, 29, 22, 25, 15, 28, 14, 20, 11, 17]
  13. 请输入需要删除的元素的值50
  14. 请输入的元素不在列表中

3.列表的排序

        例1 选择法排序 --- 有n个元素参与排序,一共进行n-1次比较,每次都是当前值与下一个值进行比较,比较到n之前结束,大于号为升序,小于号为降序

  1. # 例1 选择法排序 --- 有n个元素参与排序,一共进行n-1次比较,每次都是当前值与下一个值进行比较,比较到n之前结束
  2. import random
  3. t1 = random.sample(range(10, 30), 10)
  4. print('排序前:', t1)
  5. for i in range(len(t1) - 1):
  6.    for j in range(i + 1, len(t1)):
  7.        if t1[i] > t1[j]:
  8.            t1[i], t1[j] = t1[j], t1[i]
  9. print('排序后:', t1)
  10. 结果:
  11. 排序前: [12, 17, 15, 29, 13, 25, 27, 22, 16, 10]
  12. 排序后: [10, 12, 13, 15, 16, 17, 22, 25, 27, 29]

        例2 插入排序

  1. # 例2 插入排序
  2. import random
  3. t1 = random.sample(range(10, 30), 10)
  4. print('排序前:', t1)
  5. for i in range(1, 10):
  6.    t = t1[i] # t为待插入元素
  7.    j = i - 1
  8.    # while 循环作用:将比当前元素大的值向右移动
  9.    while j >= 0 and t < t1[j]:
  10.        t1[j + 1] = t1[j]
  11.        j = j - 1
  12.    t1[j + 1] = t # 插入备份的元素
  13. print('排序后:', t1)
  14. 结果:
  15. 排序前: [24, 16, 28, 15, 25, 17, 13, 10, 29, 18]
  16. 排序后: [10, 13, 15, 16, 17, 18, 24, 25, 28, 29]

排序归类

使用sort()方法排序

        格式 --- listname.sort(key = None,reverse = False)

key --- 元素排序时比较的关键字 --- 如:key = str.lower --- 排序时不区分大小写字母

reverse --- 排序规则,Ture表示降序,False表示升序,默认为升序

sort( ) --- 该方法会修改列表的内容,返回值为None

        例 对列表进行升序

  1. import random
  2. list1 = random.sample(range(0, 20), 20)
  3. print('排序前:', list1)
  4. list1.sort()
  5. print("升序排序为:", list1)
  6. list1.sort(reverse=True)
  7. print("降序排序为:", list1)
  8. 结果:
  9. 排序前: [15, 17, 14, 0, 1, 7, 13, 4, 10, 3, 2, 18, 6, 5, 16, 11, 9, 19, 8, 12]
  10. 升序排序为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  11. 降序排序为: [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

使用内置的sorted( )

        用法 --- 参照上述sort()

        注意 --- 不改变列表的顺序,会生成副本

        例 对列表进行降序排序

  1. # 使用sorted()方法进行降序排列
  2. import random
  3. list1 = random.sample(range(0, 20), 20)
  4. print(list1)
  5. print(sorted(list1, reverse=True))
  6. print(list1)
  7. 结果:
  8. [7, 18, 5, 16, 14, 13, 4, 19, 17, 8, 1, 0, 9, 12, 3, 15, 2, 11, 6, 10]
  9. [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
  10. [7, 18, 5, 16, 14, 13, 4, 19, 17, 8, 1, 0, 9, 12, 3, 15, 2, 11, 6, 10]

4.列表的查找

index( )方法

        定义 --- 用来查找某个元素在列表中第一次出现的位置(索引) --- 若果没有该元素,会导致ValueError错误 ,所以需要配合count( )方法判断是否存在该元素

        格式 --- listname.index(obj,start,end)

listname --- 列表名

obj --- 查找的元素对象

start --- 起始索引

end --- 终止索引(不包含)

返回值 --- 索引

  1. list1 = [40, 36, 38, 89, 2, 36, 100, 7, -20, 20.5, -999]
  2. print(list1.index(2))  # 查找数据2
  3. print(list1.index(100, 3, 7))  # 在[3,7)索引中查找100
  4. print(list1.index(7, 4))  # 从4索引开始到结束查找7
  5. print(list1.index(89, 0, 2))  # 0索引到1索引查找89,未找到报错
  6. 结果:
  7. Traceback (most recent call last):
  8.  File "E:\pythontext\test3.py", line 1381, in <module>
  9.    print(list1.index(89, 0, 2))  # 0索引到1索引查找89,未找到报错
  10. ValueError: 89 is not in list
  11. 4
  12. 6
  13. 7

        例 有列表andy,内容包含名称和一系列的比赛的分,计算他在第几场得到最高分

  1. andy = ['andy', 23, 19, 22, 31, 18, 15]
  2. print(andy)
  3. scorce_max = max(andy[1:])
  4. i = andy.index(scorce_max)
  5. print(andy[0], "在第%d场的最高分数%d" % (i - 1, scorce_max))
  6. 结果:
  7. ['andy', 23, 19, 22, 31, 18, 15]
  8. andy 在第3场的最高分数31

        使用 in 和not in查找列表元素

  1. list1 = [40, 36, 89, 2, 36]
  2. print(2 in list1)
  3. print(100 not in list1)
  4. 结果:
  5. True
  6. True

        二分法查找(折半查找)--- 要求必须是有序(升序)序列,若为无序序列则应该先排序

  1. # 二分查找法
  2. import random
  3. list1 = random.sample(range(0, 20), 20)
  4. list1.sort()
  5. print(list1)
  6. n = int(input('请输入要查找的值:'))
  7. i = 0
  8. j = 20 - 1
  9. while i <= j:
  10.    mid = (i + j) // 2 #计算中间数索引
  11.    if list1[mid] == n:
  12.        print('找到了')
  13.        break
  14.    else:
  15.        if n < list1[mid]:
  16.            j = mid - 1 #向左折半
  17.        else:
  18.            i = mid + 1 #向右折半
  19. if i > j:
  20.    print('未找到')
  21.    
  22. 结果:
  23. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  24. 请输入要查找的值:9
  25. 找到了

5.列表逆置(颠倒顺序)

        格式 --- listname.reverse

        

  1. import random
  2. list1 = random.sample(range(0, 20), 10)
  3. print(list1)
  4. list1.reverse()
  5. print(list1)
  6. 结果:
  7. [13, 4, 9, 1, 14, 17, 10, 11, 5, 0]
  8. [0, 5, 11, 10, 17, 14, 1, 9, 4, 13]

注意:

        永久性的改变,若需要使用原始数据则只需要再执行一次

6.列表的元素组合

        作用 --- 将列表的元素组成一个字符串

        格式 --- char.join(seq)

char --- 组合后元素的分隔符

seq --- 表示处理的对象,必须为列表、元组等序列数据

        例

  1. char = '-'
  2. list1 = ['silicon', 'stone', 'education']
  3. print(char.join(list1))
  4. print('=='.join(list1))
  5. print('\n'.join(list1))
  6. 结果:
  7. silicon-stone-education
  8. silicon==stone==education
  9. silicon
  10. stone
  11. education

7.列表的浅拷贝与深拷贝

        列表之间的赋值

  1. list1 = [1, 2, 3, 4]
  2. list2 = list1
  3. print(id(list1), id(list2))
  4. for i in range(len(list1)):
  5.    list1[i] += 1  # list1中所有元素值加1
  6. print(list1)
  7. print(list2)
  8. 结果:
  9. 1132680788160 1132680788160
  10. [2, 3, 4, 5]
  11. [2, 3, 4, 5]

注意:

        列表复制相当于取别名,即两者都指向同一个堆栈区的地址列表对象,操作任意一个,另一个同步变化

浅拷贝

  1. list1 = [1, 2, 3, 4]
  2. list2 = list1.copy()  # list2是list1的浅拷贝结果
  3. print(id(list1), id(list2))
  4. for i in range(len(list1)):
  5.    list1[i] += 1  # list1中所有元素值加1
  6. print(list1)
  7. print(list2)
  8. 结果:
  9. 1799131117824 1799131118080
  10. [2, 3, 4, 5]
  11. [1, 2, 3, 4]

分析:

         list2是list1列表的浅拷贝,id与list1不同,这是因为通过浅拷贝,产生的一段新的内存地址空间,与list2绑定,虽然内容相同但地址不同,相互隔离,互补影响,--- 列表中出现可变类型时则浅拷贝无效

        例

  1. list1 = [1, 2, [3, 4]]
  2. list2 = list1.copy()  # list2是list1的浅拷贝结果
  3. print(id(list1), id(list2))
  4. list1[0] += 1
  5. list1[1] += 1
  6. list1[2][0] += 1
  7. list1[2][1] += 1
  8. print(list1)
  9. print(list2)
  10. print(id(list1[2]), id(list2[2]))
  11. 结果:
  12. 2688355350976 2688355364736
  13. [2, 3, [4, 5]]
  14. [1, 2, [4, 5]]
  15. 2688355350784 268835535078

分析

        list1列表两个不可变元素1和2没有改变,并且没有影响list2,但list1的可变类型元素[3,4]改为[4,5]list2列表中的字列表也一同改变,说明list1与list2并没有完全隔离开来,虽然list1和list2的内存地址相互独立,但列表第三项绑定的是同一个子列表地址,如果原列表包含了可变类型元素,通过浅拷贝得到的新列表,不能实现与原列表完全各路,若完全隔离需要使用深拷贝

深拷贝

  1. import copy
  2. list1 = [1, 2, [3, 4]]
  3. list2 = copy.deepcopy(list1)  # list2是list1的深拷贝结果
  4. print(id(list1), id(list2))
  5. list1[0] += 1
  6. list1[1] += 1
  7. list1[2][0] += 1
  8. list1[2][1] += 1
  9. print(list1)
  10. print(list2)
  11. print(id(list1[2]), id(list2[2]))
  12. 结果:
  13. 2239442863744 2239442464000
  14. [2, 3, [4, 5]]
  15. [1, 2, [3, 4]]
  16. 2239443485760 2239442463680

分析

        通过深拷贝,子列表完全隔离,从而实现了与原列表真正的完全区分隔离

8.列表的推导式

        作用 --- 可以疏通推导式生成新列表

        格式 --- listname = [表达式,for,循环变量,in range()]

        例1 创建数值为0-19的列表

  1. list1 = [x for x in range(20)]
  2. print(list1)
  3. #相当于:
  4. list1 = []
  5. for x in range(20):
  6.    list1.append(x)
  7. print(list1)
  8. 结果:
  9. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

        例2 创建100-200间30个数的随机数列表

  1. # 创建100-200间30个数的随机数列表
  2. import random
  3. list1 = [random.randint(100, 200) for i in range(30)]
  4. print(list1)
  5. 结果:
  6. [158, 105, 170, 101, 158, 144, 118, 141, 133, 148, 185, 120, 134, 115, 146, 189, 150, 194, 187, 131, 142, 181, 167, 148, 144, 141, 108, 136, 125, 168]

        randint(x,y) 表示产生一个随机数,范围在x与y之间

根据就列表生成指定新列表

        格式 --- newlistname = [表达式,for 循环变量 in 旧列表]

        例 根据原列表生成数值折半列表

  1. # 例 根据原列表生成数值折半列表
  2. import random
  3. list1 = [random.randint(0, 100) for i in range(20)]
  4. print(list1)
  5. list2 = [x / 2 for x in list1]
  6. print(list2)
  7. 结果:
  8. [59, 85, 12, 1, 23, 85, 38, 8, 59, 88, 29, 50, 100, 18, 42, 29, 67, 84, 34, 38]
  9. [29.5, 42.5, 6.0, 0.5, 11.5, 42.5, 19.0, 4.0, 29.5, 44.0, 14.5, 25.0, 50.0, 9.0, 21.0, 14.5, 33.5, 42.0, 17.0, 19.0]

从旧列表中选择符合条件的元素组成新列表

        格式 --- newlistname = [表达式,for 循环变量 in 旧列表名 if 条件表达式 ]

        例 创建1-10之间的偶数列表

  1. # 例 创建1-10之间的偶数列表
  2. import random
  3. list1 = [random.randint(0, 100) for i in range(10)]
  4. print(list1)
  5. list2 = [x for x in list1 if x % 2 == 0]
  6. print(list2)
  7. 结果:
  8. [21, 22, 49, 77, 56, 44, 30, 48, 37, 55]
  9. [22, 56, 44, 30, 48]

注意

        只用列表推导式来创建新列表,并且竟可能保持简短

        如果列表推导式的代码超过2行,则代码可读性大大降低,应考虑写成循环

9.程序实例

        例1 将20个十进制整数存储在xx列表中,计算系列表的奇数平均值,偶数平均值、偶数的方差

  1. # 例1 将20个十进制整数存储在xx列表中,计算系列表的奇数平均值,偶数平均值、偶数的方差
  2. # 方法一
  3. import numpy
  4. import random
  5. xx = random.sample(range(0, 30), 20)
  6. ave1 = []
  7. ave2 = []
  8. for i in xx:
  9.    if i % 2 == 1:
  10.        ave1.append(i)
  11.    else:
  12.        ave2.append(i)
  13. print('奇数平均值:', numpy.mean(ave1))
  14. print('偶数平均值:', numpy.mean(ave2))
  15. print('偶数方差:', numpy.var(ave2))
  16. # 方法二
  17. import numpy
  18. import random
  19. xx = random.sample(range(0, 30), 20)
  20. ave1 = [i for i in xx if i % 2 == 1]
  21. ave2 = [i for i in xx if i % 2 == 0]
  22. print('奇数平均值:', numpy.mean(ave1))
  23. print('偶数平均值:', numpy.mean(ave2))
  24. print('偶数方差:', numpy.var(ave2))
  25. 结果:
  26. 奇数平均值: 14.6
  27. 偶数平均值: 13.8
  28. 偶数方差: 77.16

        例2 将输入一行空格作为分隔符的数字去重后输出

  1. # 例2 将输入一行空格作为分隔符的数字去重后输出
  2. # split() 将空格分隔的字符串切片后转化为字符串列表
  3. list1 = input('请输入空格分隔的数字内容:').split()
  4. for i in range(len(list1)):
  5.    list1[i] = int(list1[i])
  6. print(list1)
  7. list2 = []
  8. for i in list1:
  9.    if list2.count(i) == 0:  # 统计接收列表 若为0表示唯一,则追加
  10.        list2.append(i)
  11. print(list2)
  12. 结果:
  13. 请输入空格分隔的数字内容:6 1 0 6 0 2 85 1 89 22 6 5
  14. [6, 1, 0, 6, 0, 2, 85, 1, 89, 22, 6, 5]
  15. [6, 1, 0, 2, 85, 89, 22, 5]

        例3 合并2个有序列表构成一个新的有序列表

  1. # 例3 合并2个有序列表构成一个新的有序列表
  2. list1 = list(eval(input("请输入第一个列表:")))
  3. list2 = list(eval(input("请输入第二个列表:")))
  4. # extend()在列表尾部,追加一个完整列表
  5. list1.extend(list2)
  6. list1.sort()
  7. print(list1)
  8. 结果:
  9. 请输入第一个列表:1,5,5,8,9,5,6,25,16,51
  10. 请输入第二个列表:6,5,4,8,1,2,3,4,8
  11. [1, 1, 2, 3, 4, 4, 5, 5, 5, 5, 6, 6, 8, 8, 8, 9, 16, 25, 51]

        例4 编写程序实现判断 列表是否为升序

  1. # 例4 编写程序实现判断列表是否为升序
  2. list1 = list(eval(input("请输入第一个列表:")))
  3. f = 1  # 默认认为为升序,标志位 --- 表示程序的可能性
  4. for i in range(len(list1) - 1):
  5.    if list1[i] > list1[i + 1]:
  6.        f = 0
  7.        break
  8. if f == 1:
  9.    print('该列表为升序')
  10. else:
  11.    print('该列表无序')
  12.    
  13. 结果:
  14. 请输入第一个列表:1,2,3,4,5,6
  15. 该列表为升序

        例5 输入一个十进制数转换为二进制数输出

  1. # 例5 输入一个十进制数转换为二进制数输出
  2. # 方法一
  3. list1 = []
  4. num = int(input('请输入一个十进制整数:'))
  5. if num == 0:
  6.    print('0000')
  7. else:
  8.    while num != 0:
  9.        list1.append(num % 2)
  10.        num = num // 2
  11. list1.reverse()
  12. print(list1)
  13. # 方法二
  14. list1 = []
  15. num = int(input('请输入一个十进制整数:'))
  16. if num == 0:
  17.    print('0000')
  18. else:
  19.    while num != 0:
  20.        num, r = divmod(num, 2)  # 计算num%2得到的商和余数
  21.        list1.append(r)
  22. list1.reverse()  # reverse()内置方法将列表颠倒
  23. print(list1)
  24. 结果:
  25. 请输入一个十进制整数:6
  26. [1, 1, 0]

        例6 将列表的前p的元素平移到列表尾部后输出

  1. # 例6 将列表的前p的元素平移到列表尾部后输出
  2. import random
  3. list1 = random.sample(range(0, 50), 10)
  4. print('随机的列表为:', list1)
  5. p = int(input('请输入移动元素个数:'))
  6. for i in range(p):
  7.    list1.append(list1[i])
  8. list1 = list1[p:]
  9. print(list1)
  10. 结果:
  11. 随机的列表为: [22, 19, 11, 23, 7, 8, 46, 48, 17, 40]
  12. 请输入移动元素个数:2
  13. [11, 23, 7, 8, 46, 48, 17, 40, 22, 19]
  14. ​ 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/462304
推荐阅读
相关标签
  

闽ICP备14008679号