第4章 Python 列表、元组、字典和集合

第4章 Python 列表、元组、字典和集合

本章目标是通过学习具备灵活运用 Python 列表( list )、元组( tuple )、字典( dict )和集合( set )等 4 种数据类型编写程序的能力

第1关:Python列表之列表应用之降序排序

“”"

本关任务:给定一个列表,使用 for 循环来复制它,对复制后的列表进行倒序排序

“”"

"""
任务:给定一个列表,使用 for 循环来复制它,对复制后的列表进行倒序排序。打印原列表和排序后的列表。
"""

list1=[6,9,12,3,5,8,1,8,131,58,1,581,31,8,46,13,8,4,613,30,546,0,68,4,1,3,16,99,61,-2.3]

#list2 = [i for i in list1]

list2 = []
for i in list1:
    list2.append(i)
print(f'原列表为:{list1}')
list2.sort(reverse=True)
print(f'复制后的列表为:{list2}')

执行结果
原列表为:[6, 9, 12, 3, 5, 8, 1, 8, 131, 58, 1, 581, 31, 8, 46, 13, 8, 4, 613, 30, 546, 0, 68, 4, 1, 3, 16, 99, 61, -2.3]
复制后的列表为:[613, 581, 546, 131, 99, 68, 61, 58, 46, 31, 30, 16, 13, 12, 9, 8, 8, 8, 8, 6, 5, 4, 4, 3, 3, 1, 1, 1, 0, -2.3]

第2关:Python列表之应用二

“”"

本关任务:给定一个数组,使用 for 循环复制这个数组,然后去除列表内的重复元素,最后对列表进行排序。打印去重且排序后的复制列表。

“”"

思路:由于集合存储的元素是不重复的,所以将列表转换为集合,这样重复的元素就会消失,最后在把集合转换为列表

"""
任务:给定一个数组,
使用 for 循环复制这个数组,然后去除列表内的重复元素,最后对列表进行排序。打印去重且排序后的复制列表。
"""
 
list1 = [88,5,8,6,1,23,1,15,1,61,31,6,51,1,984,9849,1,-100,513,891,3,1,48,465,132,165,4,6,132,498,46,132,165,468,498,484,11,6,84,65,132,1,64,684,6981,324,984,61,32,468,4651,6,4,9814,654,984,68,7]
 
 
list2 = []
for i in list1:
    list2.append(i)
list2 = list(set(list2))
list2.sort()
print(list2)

执行结果
转换前的列表:[88, 5, 8, 6, 1, 23, 1, 15, 1, 61, 1, -100, 513, 891, 3, 1, 48, 465, 132, 132, 165, 468, 498, 484, 11, 6, 84, 65, 132, 1, 64, 684, 6981, 324, 984, 61, 32, 468, 4651, 6, 4, 9814, 654, 984, 68, 7]
转换前的列表:[-100, 1, 3, 4, 5, 6, 7, 8, 11, 15, 23, 32, 48, 61, 64, 65, 68, 84, 88, 132, 165, 324, 465, 468, 484, 498, 513, 654, 684, 891, 984, 4651, 6981, 9814]

第3关:Python列表之列表推导式

“”"

本关任务:给定一个列表,使用列表推导式来复制它,并筛选掉其中的负数。

“”"

什么是列表推导式?

Python 中列表推导式用于使用其他可迭代对象创建一个新列表。可迭代对象表示可以使用 for 循环遍历的数据,例如列表、字符串,元组,字典,集合(元组、字典、集合会在后续实训中介绍)等。列表推导式的基本形式为[表达式 for 变量 in 可迭代对象]

例1:想得到1-10的平方组成的列表

list1_10 = [i**2 for i in range(1,11)]
print(list1_10)

执行结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

以上的代码就相当于

list1_10 = []
for i in range(1,11):
	k = i**2
	list1_10.append(k)
print(list1_10)

执行结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

例2:想得到多重嵌套中的数是 2 的倍数的元素的平方组成的列表

list1 = [[1,2,3],[4,5,6],[7,8,9],[10]]
list2 = [j**2 for i in list1 for j in i if j%2 == 0]
print(list2)

#与以下代码所表达的含义相同
list2 = []
for i in list1 :
    for j in i :
        if j%2 == 0:
            k = j**2
            list2.append(k)
print(list2)

#执行结果
[4, 16, 36, 64, 100]
[4, 16, 36, 64, 100]

例3:想得到多重嵌套的列表中,一重嵌套中列表长度大于 1 且列表中的元素为 2 的倍数的元素的平方组成的列表

list1 = [[1,2,3],[4,5,6],[7,8,9],[10]]
list2 = [j**2 for i in list1 if len(i)>1 for j in i if j%2 == 0]
print(list2)

#与以下代码所表达的含义相同
list2 = []
for i in list1:
    if len(i)>1:
        for j in i :
            if j%2 == 0:
                k = j**2
                list2.append(k)
print(list2)

#执行结果
[4, 16, 36, 64]
[4, 16, 36, 64]

熟悉了以上几个例子,那么开始完成本关的任务吧

任务:使用列表推导式复制列表并筛选出其中的复数

list1 = [2,3,-43,4,5,-5,4,-535,34,5,345,-3,45,3,6,345,-546,546,34,-56,34,5,86,7,0,12341,979,7,67,-856,454,8,-64,342,-63,568]
 
list2 = [i for i in list1 if i>=0]
print(list2)

执行结果:
[2, 3, 4, 5, 4, 34, 5, 345, 45, 3, 6, 345, 546, 34, 34, 5, 86, 7, 0, 12341, 979, 7, 67, 454, 8, 342, 568]

第4关:Python列表之列表推导式2

“”"

本关任务:给定一个列表,使用列表推导式找出列表中长度大于 5 的名字。

“”"

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]


name1 = [j for i in names for j in i if len(j)>5]
print(name1)

第5关:Python列表之复制与拷贝之矩阵乘

“”"

本关任务:给定一个列表,保留列表中的重复元素。

“”"

浅拷贝

列表是可以嵌套的,列表内的元素还可以是列表。

list1 = [1,[2,3],4,5]     # list1列表中的第二个元素也是一个列表,这就是一个嵌套列表

浅拷贝是复制列表的最外层,内存的嵌套的列表并不会复制。浅拷贝需要使用 copy 模块中的 copy 函数。

import copy
list1 = [1,[2,3],4,5]
list2 = copy.copy(list1)     # 使用浅拷贝复制一个列表
list2.append(6)     # list2末尾添加一个元素6
list2[1].append(6)     # list2第二个元素的列表的末尾添加一个6
print(list1)
print(list2)

执行结果:

[1, [2, 3, 6], 4, 5][1, [2, 3, 6], 4, 5, 6]

从执行结果可以得知,两个列表的元素不一样了,但是列表中的嵌套列表还是一致的,浅拷贝只能拷贝表层,嵌套在列表内的列表并没有拷贝。

深拷贝

如果要彻底地产生一个完全独立的复制品,就需要使用深拷贝。深拷贝需要使用到 copy 模块中的 deepcopy 函数。

import copy
list1 = [1,[2,3],4,5]
list2 = copy.deepcopy(list1)     # 使用深拷贝复制一个列表
list2.append(6)     # list2末尾添加一个元素6
list2[1].append(6)     # list2第二个元素的列表的末尾添加一个6
print(list1)
print(list2)

执行结果:

[1, [2, 3], 4, 5][1, [2, 3, 6], 4, 5, 6]

从执行结果可以看出,使用深拷贝复制出来的列表是两个完全互不影响的列表。

import copy
list1 = [1,2,4,5,36,36,2,3]
list2 = copy.deepcopy(list1)

#嵌套for循环,外层循环用于定位数字,内层循环用于将列表中的所有数字与这个外层的定位数进行比较
for i in range(len(list1)):
  #设定一个标志,当
  flag = True
  for j in range(len(list1)):
    if i == j:
      #由于内外层循环是对列表的双遍历,则去除索引相同的遍历比较情况,然后继续进行内层循环
      continue
    #若判断出相同的元素,则跳出本次循环,继续遍历其后的数字,并将flag置为false
    if list1[i] == list1[j]:
      flag = False
      break
  #如果标志为True,就说明通过内层的循环与定位数进行比较后,并没有发现与之相同的数字,那么就删除索引对应的列表元素
  if flag:
    list2.remove(list1[i])
    #list2 = list1.remove(list1[i])  之所以不能这么写是因为修改了list1的数据,导致后需的遍历会出现索引越界

#打印最后的结果
print(list2)

执行结果
[2, 36, 36, 2]

还有一种解法,即利用内置函数count(),这个函数是用于统计某个元素在序列中出现的次数

list1 = [1,2,4,5,36,36,2,3]

b = list() #将b的数据类型修改为list
#i作为索引,将列表从头开始遍历
for i in range(len(list1)):
	#若出现某个元素在列表中的count大于1的话,就将这个元素添加到列表b中
    if list1.count(list1[i])>1:
        b.append(list1[i])
print(b)

执行结果
[2, 36, 36, 2]

第6关:练习-Python列表之复制与拷贝2

“”"

本关任务:给定一个列表,删除列表中长度大于 3 的所有元素。

“”"

import copy
list1 = [1,"abc",2352,[1,2,3,4,5],"d"]
list2 = copy.deepcopy(list1)


for x in range(len(list2)):
  #当列表元素出出现int这样的数据,即不进行长度的比较,结束本次循环,继续下次的遍历
  if type(list1[x]) == int:
    continue
  #其他情况下就进行长度的比较,其他情况无非是,str、list
  elif len(list1[x]) > 3:
    #若出现比3长的直接删除这个元素即可
    list2.remove(list1[x]) 
print(list2)

执行结果
[1, 'abc', 2352, 'd']

第7关:Python元组之应用一

“”"

本关任务:给定 a、b、c 三个变量,三个变量的值都是通过 input 函数获取,且都是整型数据,请编写代码交换三个变量的值:a 的值给 b,b 的值给 c,c 的值给 a。交换之后,输出 a、b、c 的值。

“”"

a = int(eval(input()))
b = int(eval(input()))
c = int(eval(input()))
a,b,c = c,a,b
print(f'a:{a},b:{b},c:{c}')

模拟输入 2 4 5 输出 a:5,b:2,c:4
模拟输入 -10 6 8 输出 a:-10,b:6,c:8
模拟输入 0 4 6 输出 a:0,b:6,c:4     

第8关:Python元组之应用二

“”"

本关任务:给定一个元组,利用列表和元组的相互转换实现元组元素的更改,去除元组中的整型数据。

“”"

tup = (1,"3",4,5,"4","a",(1,2,3,4),"b","c",6,17,"d","D",-35,-60,(-1,-2,-5))
import copy
list1 = list(tup)
list2 = copy.deepcopy(list1)
#遍历整个列表,若出现int类型的数据,那么就在list2中将其删除即可
for i in range(len(list1)):
    if type(list1[i]) == int:
        list2.remove(list1[i])
#使用tuple()函数将list2转换成元组
tup1 = tuple(list2)
print(f'修改前的元组为{tup}')
print(f'修改后的元组为{tup1}')

第9关:Python字典之手机号归属运营商判断

我国使用的手机号码为 11 位数字,中国通信运营商主要是移动、联通和电信,手机号的前三位表示着不同的运营商,具体如下:

  • 中国移动:134(不含1349)、135、136、137、138、139、147、148、150、151、152、157、158、 159、165、172、178、182、183、184、187、188、198、197
  • 中国联通:130、131、132、140、145、146、155、156、166、167、185、186、175、176、196
  • 中国电信:133、1349(卫星通信)、149、153、180、181、189、177、173、174、191、199、162、190
  • 虚拟运营商:170、171

“”"

本关任务:给定一个列表 phone_list,列表的元素为手机号,统计列表 phone_list 中给出的手机号号码段分别归属中国移动、联通、电信、虚拟运营商的数量值,以字典的形式输出四个运营商号码的统计结果。

“”"

phone_list = [13326356606, 14009606880, 13117746845, 13737677952, 13539707714, 13406608419, 13198674678, 13349102382, 13667722277, 13110521697, 13946115637, 13149723752, 13541815803, 13079560023, 13973654411, 13748468789, 13338020203, 13268915246, 13595403218, 14081566048, 13312897257, 13550638431, 13211576991, 13903245633, 13510740896, 13271439724, 13454284234, 13472286896, 13597236046, 13906631939, 14806548278, 17900858560, 19726770323, 19918104176, 19539570356, 19900529691, 15226847591, 19654997415, 15121618282, 15442480473, 19339053026, 19366641759, 14463265315, 19073714017, 17006580414, 14271944781, 15631019895, 19841137433, 16290971678, 19811009520, 18552062840, 16743208543, 16440365880, 16620053748, 15653576577, 15333629138, 17649390649, 15692838670, 15037630744, 19939968696, 19763751652, 18277908098, 17808293824, 18833820310, 18194092865, 18660620683, 14425361601, 18539331591, 19030911487, 19435815688, 15996524456, 14452455624, 15690512591, 19060853054, 18150019502, 17308588318, 14117735569, 17647113910, 17556077173, 19003416927, 14130557697, 16120832424, 16763584569, 16137496845, 16575402975, 15592200859, 18340329180, 14271394612, 15062698355, 19858230631, 18632675309, 17218219173, 14552234749, 15646357287, 19565403573, 18842258105, 18311403339, 14230644149, 14272313801, 19318196032]

# 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
##########Begin##########
# 编写代码判断电话号码的运营商归属,
#并以字典的形式输出各个运营商的电话号码数量
num1 = 0
num2 = 0
num3 = 0
yd = [134,135,136,137,138,139,147,148,150,151,152,157,158,159,165,172,178,182,183,184,187,188,198,197]
lt = [130,131,132,140,145,146,155,156,166,167,185,186,175,176,196]
dx = [133,1349,149,153,180,181,189,177,173,174,191,199,162,190]
xn = [170,171]

yd1 = str(yd)
lt1 = str(lt)
dx1 = str(dx)
xn1 = str(xn)


res = {
    
    "移动":0,"联通":0,"电信":0,"虚拟":0}


for num in phone_list:
    num = str(num)
    # 电信中的特殊字段是卫星通信,即截取前四位
    if num[:4] in dx1:
        res["电信"] += 1
    # 使用字符串的切片操作来切取手机号的前三位,用于判断运营商归属地;
    elif num[:3] in yd1:
        res["移动"] += 1
    elif num[:3] in lt1:
        res["联通"] += 1
    elif num[:3] in dx1:
        res["电信"] += 1
    elif num[:3] in xn1:
        res["虚拟"] += 1


print(res)


执行结果
{
    
    '移动': 35, '联通': 28, '电信': 16, '虚拟': 1}

第10关:Python字典之应用二

“”"

本关任务:给定一个字典,该字典的值只能是整型数据,键为该数字的字符型,比如{"5":5},但是字典中的键值对并不是都按照这个规则排序的,可能出现{"5":4}的情况,请编写代码将字典的值改为和键一致的整型数值。

“”"

dict1 = {
    
    "4":3,"14":14,"5":6,"33":33,"25":25,"18":68,"0":0,"10":3,"42":24,"7":1,"64":64,"49":49,"90":90,"48":48,"68":86,"41":12,"46":46,"91":91,"75":75,"27":39,"34":3,"57":11}
 
d = {
    
    }
for i in dict1:
    d[i] = int(i)
print(d)

执行结果
{
    
    '4': 4, '14': 14, '5': 5, '33': 33, '25': 25, '18': 18, '0': 0, '10': 10, '42': 42, '7': 7, '64': 64, '49': 49, '90': 90, '48': 48, '68': 68, '41': 41, '46': 46, '91': 91, '75': 75, '27': 27, '34': 34, '57': 57}

第11关:Python集合之应用一

“”"

本关任务:给定一个集合,使用集合的内置函数来删除集合内的非整型数据,然后将集合转换成列表并对其进行排序。

“”"

agg = {
    
    1,"3",4,5,"4","a",(1,2,3,4),"b","c",6,17,"d",("a","b","c"),0,"e","f",True,10,"False",11,"h","A","B","C",30,"D",-35,-60,(-1,-2,-5)}
list1 = []
for i in agg:
    if type(i) == int:
        list1.append(i)
list1.sort()
print(list1)

执行结果
[-60, -35, 0, 1, 4, 5, 6, 10, 11, 17, 30]

第12关:Python集合之应用二

“”"

本关任务:给定一个列表,利用集合的性质以及它的内置函数来对列表进行去重,打印去重后的列表。

“”"

list1 = [453,5,3,4,5,5,7,6,77,87,8,89,78,78,86,78,56,75,623,4523,45,234,778,9,78,989,0,8,98,68,67,856,7,46,45,6]
list2 = list(set(list1))
print(list2)

执行结果
[0, 3, 4, 5, 6, 7, 8, 9, 778, 4523, 45, 46, 56, 67, 68, 453, 75, 77, 78, 86, 87, 856, 89, 989, 98, 234, 623]

猜你喜欢

转载自blog.csdn.net/qq_41959899/article/details/111825395
今日推荐