五、字典与集合(跟着孙兴华老师学Python)

  • Post author:
  • Post category:python




一、字典的应用场景及定义



1、什么时候用字典,当下标不好用的时候

例如:

序列名 = [‘华为’,520,‘小米’,520,‘苹果’,14,‘三星’,24]

当顺序变化后,数据就乱了,而且下标也不管用了。

这个时候,就要用到字典了,字典和数据顺序无关,所以字典不支持下标,字典是按key(键)和value(值)的方式成对出现,俗称键值对。



2、字典的定义:

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

字典用大括号包裹,数据是键:值成对出现。

空字典的创建

名字 = { }

名字 = dict( )



二、字典的增删改查(可变型)



1、增加和修改数据

增加和修改数据:

语法: 字典序列名[键] = 值

如果键存在则修改对应的值,如果键不存在新增这个键和值。

a={'华为':520,'小米':520,'苹果':14,'三星':24}
a['华为']=521 #存在华为:520 改变华为的值
print(a)
a['一加']=321 #字典a中不存在一加,添加一加:321这个数据
print(a)

{‘华为’: 521, ‘小米’: 520, ‘苹果’: 14, ‘三星’: 24}

{‘华为’: 521, ‘小米’: 520, ‘苹果’: 14, ‘三星’: 24, ‘一加’: 321}



2、删数据:

删除字典内数据语法:del字典序列名[键] # 只需要写键,它会把键和值一起删除

删除整个字典的语法:del 字典序列名

清空字典:clear( ) 字典序列名.clear( )



代码:

del a['华为']#删除华为:521这个键值对
print(a)
a.clear()# 清空字典
print(a)

{‘小米’: 520, ‘苹果’: 14, ‘三星’: 24, ‘一加’: 321}

{}



3、查

**3.1查数据: **注意只能用键查值,不能用值查键,因为键是唯一的,值可能是重复的。

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

print(字典序列名[‘小米’]) 返回:520

print(字典序列名[‘诺基亚’]) 返回:报错

总结:如果键存在,我们返回值,否则报错。


3.2 字典的查询方法:


(1)get( ) 语法: 字典序列名.get(键,随便写)

如果键存在,返回值。如果键不存在,返回默认值,默认值是你随便写的内容,如果省略了这个参数,返回None。

(2)values( ) 语法: 字典序列名.values( ) # 返回字典中所有的值

(3)items( ) 语法:字典序列名.items( ) #可迭代对象(里面的数据是元组),迭代就是重复反馈过程

a={'华为':520,'小米':520,'苹果':14,'三星':24}
print(a['小米'])#查小米的值

print(a.get('小米'))#使用get方法#变量名.方法

print(a.get('一加','不存在'))#一加不存在返回默认值不存在
print(a.get('一加'))#省略了返回的参数,返回None

print(a.values())#返回字典中所有的值
print(a.items())#返回以元组形式出现的键值对



结果:



520

520

不存在

None

dict_values([520, 520, 14, 24])

dict_items([(‘华为’, 520), (‘小米’, 520), (‘苹果’, 14), (‘三星’, 24)])



三、字典的循环遍历



1、遍历字典的键

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

for 键 in 字典序列名.keys( ):

print(键)



2、遍历字典的value

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

for 值 in 字典序列名.values( ):

print(值)



3、遍历字典的元素 (返回:每行是一个元组)

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

for 元素 in 字典序列名.items( ):

print(元素)



4、遍历字典的键和值

字典序列名 = {‘华为’:520,‘小米’:520,‘苹果’:14,‘三星’:24}

for 键 , 值 in 字典序列名.items( ):

print( f’ {键} = {值} ‘)

a = {'华为':520,'小米':520,'苹果':14,'三星':24}

for i in a.keys():#遍历字典的键
    print(i)

for i in a.values():#遍历字典的值
    print(i)

for i in a.items():#以元素的形式遍历
    print(i)

for i,j in a.items():
    print(f'{i}={j}')



结果:



华为

小米

苹果

三星

520

520

14

24

(‘华为’, 520)

(‘小米’, 520)

(‘苹果’, 14)

(‘三星’, 24)

华为=520

小米=520

苹果=14

三星=24



四、集合



1、集合的创建

创建集合:可以用{ } 或 set( )创建集合,但是创建空集合必需用set( ),因为{ }创建的是空字典

集合的特点: (1)自动去除重复数据 (2)顺序是随机的,所以不支持下标

集合名 = {1,2,3,4,5,6,7}

集合名 = {1,2,3,4,4,5,5,6,7} # {1, 2, 3, 4, 5, 6, 7} 自动去重复

空集合 = set( )

a={}
print(type(a))
a={1,2,3}
print(type(a))
a=set()
print(type(a))


结果:


<class ‘dict’>

<class ‘set’>

<class ‘set’>



2、集合的常见操作


2.1增加数据:


集合名.add(数据) # 因为集合自动去重复,所以增加重复内容时不进行任何操作


2.2 追加数据序列:


集合名.update(数据序列) # 数据序列:列表,字符串,元组


2.3删除数据:


集合名.remove(数据) # 如果数据不存在,报错

集合名.discard(数据) # 如果数据不存在,不报错

集合名.pop( ) # 随机删除集合中某个数据,并返回这个数据

查看返回数据 变量名 =集合名.pop( )

查看被删除的数据 print(变量名)

查看集合还剩下什么 print(集合名)


2.4查找数据:


in: 判断数据是否在集合序列中

not in: 判断数据不在集合序列中

print( 数据 in 集合名 ) # 返回 True 或 False

print( 数据 not in 集合名 ) # 返回 True 或 False

#增加数据
a={1,2,3,4,5,6,3,4}
print(a)
a.add(9)
print(a)

#增加序列
a.update([7,8,9])#添加列表
print(a)

a.update((11,12))#添加元组
print(a)

a.update("abc")#添加字符串
print(a)


#删除数据
a.remove(1)
print(a)

a.discard(9)
print(a)

#a.remove(77)#删除不存在的数据报错
#print(a)

a.discard(34)#删除不存在的数据不报错
print(a)

print(a.pop())#随机删除某个数据
print(a)

#查找数据
print(1in a)
print(1not in a)

#类型转换
a=[1,2,3]
b=(4,5,6)
print(set(a))#序列转换为集合
print(set(b))#元组转换为集合



结果



{1, 2, 3, 4, 5, 6}

{1, 2, 3, 4, 5, 6, 9}##增加数据

{1, 2, 3, 4, 5, 6, 7, 8, 9}#增加列表

{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}

{1, 2, 3, 4, 5, 6, 7, 8, 9, ‘c’, 11, 12, ‘b’, ‘a’}

{2, 3, 4, 5, 6, 7, 8, 9, ‘c’, 11, 12, ‘b’, ‘a’}

{2, 3, 4, 5, 6, 7, 8, ‘c’, 11, 12, ‘b’, ‘a’}

{2, 3, 4, 5, 6, 7, 8, ‘c’, 11, 12, ‘b’, ‘a’}

2

{3, 4, 5, 6, 7, 8, ‘c’, 11, 12, ‘b’, ‘a’}

False#查找数据

True

{1, 2, 3}#数据转换

{4, 5, 6}



五、牛客网练习题



1、创建一个字典列表,并遍历字典中的值

my_dict_1={'name': 'Niuniu','Student ID': 1}
my_dict_2={'name': 'Niumei','Student ID': 2}
my_dict_3={'name': 'Niu Ke Le','Student ID': 3}
dict_list=[]
dict_list.append(my_dict_1)#字典1追加到列表中
dict_list.append(my_dict_2)
dict_list.append(my_dict_3)
for i in dict_list:#此时的i是列表中的元素,也就是一个字典,是my_dict_1/my_dict_2/my_dict_3
    print(f"{i['name']}'s student id is {i['Student ID']}.")



结果:



Niuniu’s student id is 1.

Niumei’s student id is 2.

Niu Ke Le’s student id is 3.



2、创建一个字典,其值以键值对的形式存在,遍历输出其键和值

描述

创建一个依次包含键-值对’Beijing’: {Capital: ‘China’}、‘Moscow’: {Capital: ‘Russia’}和’Paris’: {Capital: ‘France’}的字典cities_dict,

请使用for循环遍历”已使用sorted()函数按升序进行临时排序的包含字典cities_dict的所有键的列表”,

对于每一个遍历到的城市名,使用print()语句一行输出类似字符串’Beijing is the capital of China!’的语句。



代码:

cities_dict={'Beijing': {"Capital": 'China'},
            'Moscow': {"Capital": 'Russia'},
            'Paris': {"Capital": 'France'}
            }
for i in sorted(cities_dict.keys()):
    print(f"{i} is the capital of {cities_dict[i]['Capital']}!")



结果:



Beijing is the capital of China!

Moscow is the capital of Russia!

Paris is the capital of France!



3、创建一个字典,其值以列表的形式存在,遍历输出其键和值

描述:

使用for循环遍历”使用sorted()函数按升序进行临时排序的包含字典result_dict的所有键的列表”,对于每一个遍历到的名字,先使用print()语句一行输出类似字符串”Allen’s favorite colors are:”的语句,然后再使用for循环遍历该名字在字典result_dict中对应的列表,依次输出该列表中的颜色。



代码:

result_dict={'Allen': ['red', 'blue', 'yellow'],'Tom': ['green', 'white', 'blue'],'Andy': ['black', 'pink']}
for i in sorted(result_dict.keys()):#i是字典的键
    print(f"{i}'s favorite colors are:")
    for j in range(len(result_dict[i])):#j是列的下标
        print(result_dict[i][j])



结果:



Allen’s favorite colors are:

red

blue

yellow

Andy’s favorite colors are:

black

pink

Tom’s favorite colors are:

green

white

blue



解题思路:


先找到字典的值,在找到值(列表)的每一个数据



4、讲两份列表封装成字典

name=input().split()#创建列表
language=input().split()
print(dict(zip(name,language)))


知识点:

zip函数



打包:

zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同

示例:

list1 = [1,2,3,4,5]
list2 = ["hello","good","nice","haha"]
set3 = {True,False,None,0}
zipobj = zip(list1,list2,set3)  # 打包

print(zipobj) # 这是一个包,显示的是包所在的地址 <zip object at 0x00000149CFFFAB48>

print(list(zipobj)) #可以将包转化为列表,查看包中的内容 

# 打印结果为 [(1, 'hello', False), (2, 'good', True), (3, 'nice', None)]



解释:



1、列表中的元素只有3个,是因为set3()是集合,集合的特点:无序、去重

2、打包的具体过程

首先在list1中取出元素1,在list2中取出元素hello,在set3中取出元素False,组成了第一个元组(1, ‘hello’, False);

然后在list1中取出元素2,在list2中取出元素good,在set3中取出元素True,组成了第二个元组(2, ‘good’, True);

在list1中取出元素3,在list2中取出元素nice,在set3中取出元素None,组成了第三个元组(3, ‘nice’, None);

set3里只有三个元素,所以,list1和list2中剩余的元素就被舍弃,最后,将三个元组放入列表中,[(1, ‘hello’, False), (2, ‘good’, True), (3, ‘nice’, None)],最终打包完成。

解包:

zip()函数可以对 zip对象进行解包处理

语法:zip(*zipobj)



5、查找一个键是否在字典中,字典的值为列表形式

输入描述:

输入一个字母,必定在上述字典中。

输出描述:

同一行中依次输出每个单词,单词之间以空格间隔。

dict1={'a': ['apple', 'abandon', 'ant'], 'b': ['banana', 'bee', 'become'], 'c': ['cat', 'come'], 'd': 'down'}
zimu=input()
for j in range(len(dict1[zimu])):
    print(dict1[zimu][j],end=' ')

输入:

a

输出:

apple abandon ant


思路:


先找到值,求这个值(列表)的长度,用range 、for遍历输出 这个键的值



6、使用字典计数

letter=input()
dict1={}
for i in letter:
    dict1[i]=letter.count(i)#对letter字符串使用计数的方法
print(dict1)

声明:

1、此博客仅供交流学习

2、主要参考孙兴华老师的课程:孙兴华老师的python基础课程

3、部分知识点来源于本站其他博主总结,详见链接



版权声明:本文为qq_42580901原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。