python基础-【列表】【集合】的运用

目录

一、列表的基础写法

【题目】

二、集合的基础写法

1、集合的创建

2、集合的特性

Ⅰ-【归一性】/【唯一性】

Ⅱ-【无序性】(并非所谓的简单无序)

三、列表的基础写法与列表转集合(set()函数)

 四、元组的基础写法与转集合(set()函数)

 

五、字典的基础写法与字典被转换为集合的注意事项

1、【字典内容部分】

 2、字典转换成集合的【注意事项】

六、字典进阶版 - 嵌套字典(感觉太难的话,了解有个印象就好啦) 



一、列表的基础写法

列表名=['内容','内容','内容','内容']

#例如班上有这5名同学
class1 = ['Joan', 'Bill', 'Niki', 'Mark', 'Mark']

 可直接打印

print(class1)


#输出['Joan', 'Bill', 'Niki', 'Mark', 'Mark']
【题目】

给出2个班级的名字,请找出两个班级相同学生的名字

#班级
class1 = ['Joan', 'Bill', 'Niki', 'Mark', 'Mark']
class2 = ['Tom', 'Linda', 'Bill']

#比较两个班的同学,查询是否有重名学生,如果有则输出重名的学生的名字

#设置class1和class2两个列表
class1 = ['Joan', 'Bill', 'Niki', 'Mark', 'Mark']
class2 = ['Tom', 'Linda', 'Bill']

#循环遍历class1,其中每个元素都与class2中的元素做比较
for name1 in class1:
    for name2 in class2:
        if name1 == name2: #如果相同
            print(name1)#将该元素打印

#缺点:嵌套了2层for循环,(时间)复杂度较大并且
#      如果有个名字出现了2次,那么也会打印2次
#      该学生的名字。

注意!因为嵌套的问题,2个for循环嵌套(数据结构里是有说的),时间复杂度会比较大,而且这个程序的逻辑是,检索相同的名字,所以如果一个班级里面有2个相同名字的话会打印2次,如果2个班级都有2个相同名字的学生(2+2)那么他会打印4次这个学生的名字


二、集合的基础写法
1、集合的创建
#创建集合的方式:
a = set()
b = {1, 2, 'abc'}

#注意如果创建空集合,要使用set(),而不是a={}
print(a)        #输出set()
print(b)        #输出{1,2,'abc'}
 
2、集合的特性
Ⅰ-【归一性】/【唯一性】

即:自动将重复的元素消除,保留不重复的元素。元素具有唯一性,也是说集合中不会出现重复的元素(意思一样的)

#如果打印的是有重复的元素,默认会将重复的元素进行归一化
c = {1, 2, 1, 1, 2}
print(c)        #{1,2}
Ⅱ-【无序性】(并非所谓的简单无序)

即:元素顺序可能没有顺序可言,不像顺序表那样有顺序,不能用索引的方式访问,但可以使用遍历访问    (例一)

【重点来了!!!】无序并非真的一点规律都没有,集合可以插入数字字符串,字符串是真的无序,而数字一定是从小到大排列的    (例二)

例一
a = 'abcde'             #a为字符串
test = set(a)           #需要注意的是,集合中的元素顺序可能与原字符串中的顺序不同
#因为集合是无序的,这就是无序性。
print(test)#输出{'c','e','d','a','b'}

例二
c={1,7,3,4,5,'TOM','CAT','I','Really','love','you'}
print(c)                #运行如下

 【集合无序的本质】关于这个无序的问题,他不是集合本身无序,而是存进集合时无序,一旦存进地址池的时候,顺序就固定了,验证这个问题:

#只需要用循环验证即可
c={1,7,3,4,5,'TOM','CAT','I','Really','love','you'}
for i in range(30):
    print(c)            #证明存进地址的时候是固定的,只是存的时候无序,所以打印出来的时候顺序固定

三、列表的基础写法与列表转集合(set()函数)

列表与集合的方式相近,列表是以小括号[  ]括起来的,而集合是花括号{  },而set()函数就是将字符串转为集合

转为集合的函数:set()

b = [1,2,3]             #b为列表
test = set(b)           #test已经是集合了
print(b)                #输出[1,2,3]--列表
print(test)             #输出{1,2,3}--集合

#注意!输出列表的时候是不带花括号的,与集合的输出不同

 四、元组的基础写法与转集合(set()函数)

与上述不同的点在于,元组是用小括号括起来的,其他点都一样,了解即可

c = (1, 2, 'abc')       #c为元组
print(c)                #输出(1,2,'abc')
test = set(c)
print(test)             #输出{1,2,'abc'}
五、字典的基础写法与字典被转换为集合的注意事项
1、【字典内容部分】

字典组成:由key和value组成,即item={ 'key1' : 'value1' , 'key2' : 'value' , ... }

即:key与其所对应的value值组成

d = {'a':1, 'b':2, 'c':3}        #d为字典
print(d)                         #输出{'a':1, 'b':2, 'c':3}
print(d.items())                 #输出dict_items([('a', 1), ('b', 2), ('c', 3)])
print(d.keys())                  #输出dict_keys(['a', 'b', 'c'])
print(d.values())                #输出dict_values([1, 2, 3])

#注意!  此处取的item、key、value的值均要带上s,即函数items()、keys()、values()

#一般用这些函数的时候可能是涉及:计算大小 比较大小嵌套字典取值

 2、字典转换成集合的【注意事项】

d = {'a':1, 'b':2, 'c':3}        #d为字典
print(d)                         #输出{'a':1, 'b':2, 'c':3}
test = set(d)                    #用set()将d转为集合
print(test)                      #输出{'a','b','c'}

#字典转为集合后,会将字典中的key添加至集合(比如a),value就被忽略了(比如a对应的1)

#如果想取value值的话就用上面说的.values()函数就行,即:

test = set(d.values())                    #用set()将d转为集合

print(test)                                      #输出{1,2,3}

#如此即可取value值到集合了

六、字典进阶版 - 嵌套字典(感觉太难的话,了解有个印象就好啦) 

顾名思义就是在字典里面再搞一个类似于字典的东西,为什么要搞嵌套字典呢,因为单层的字典只有一个key对应一个value数据,不讲太抽象↓↓↓

就比如一个班级的学生(key),只能写一个value(比如性别),那你根本不够写啊,众所周知!一个学生好歹有:【学号】、【性别】、【年龄】对吧?

所以value肯定一个不够用的嘛,就以成绩为例吧,期末考试义务教育主科分数:【语文】、【数学】、【英语】,将它们放进一个字典里(外加一个要求:获取第一名的名字)

#自己写的成绩放进字典里
student = {
    '小明': {'语文': 90, '数学': 88, '英语': 76},
    '小红': {'语文': 78, '数学': 68, '英语': 96},
    '小亮': {'语文': 92, '数学': 78, '英语': 86}
}
def calc_score1(sutdent_val):                   #def是指自定义函数1
        score_sum=sum(sutdent_val.values())
#sum()函数是计算括号内的分数得到总分,用.values()函数取字典内value值(先别纠结,先看下去)
        return score_sum                        #用这个自定义函数的返回值是总分数

​​​​​​​for name,val in student.items():
#定义name和val变量去遍历student表里的item项目,分别
#对应key和value,不加.items()是指遍历字典,加了是指遍历项目
    sumval=calc_score1(val)
#调用自定义的函数代入val到括号计算总分(此时val是
#指字典里的value那一块,往val里面取学科)
    print(f'{name}分数{sumval}')                 #输出同学的学科总分

以上计算总分,下面开始找出最大值对应的学生

# 计算总分最高的学生
height_score=max(calc_score1(val) for val in student.values())
#用max函数计算在自定义函数1中分数最高值(注意有参数val),条件是在stude
#nt.values()中(注意此处有参数),循环找到val代入到函数1中的最大值
height_score_student = next(name for name,val in student.items() if calc_score1(val)==height_score)
#用for找出在项目里总分等于最高分的学生,返回这些都是最高分的学生,用next输出一次第一个最高分的学生
#有个缺点是:如果有多个都是最高分的学生,就只会输出一个
#next()是一个内置函数,用于从迭代器中获取下一个项目,如果没有得再迭代会返回'No more elements',而不是StopIteration异常(停止迭代异常)

#再次说明:next()是一个内置函数,用于从迭代器中获取下一个项目,如果没有得再迭代会返回'No more elements',而不是StopIteration异常(停止迭代异常)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值