1.字典
1.1.认识字典
- 字典在python中,是可以让数据更加清晰的数据容器,用“{}”表示,里面的元素以键值对的方式存储,例如:
#创建一个外星人游戏,这些外星人的颜色和点数各不相同
#这是一个简单的字典,存储了有关特定外星人的信息
alien_0={'color':'green','points':5}
print(alien_0)
#使用两条print语句来访问并打印这些信息
print(alien_0['color'])
print(alien_0['points'])
>>>{'color': 'green', 'points': 5}
green
5
在字典中,字典的键有两个要求:
- ①字典的键必须是不可变数据类型
- 不可变数据类型包括:数字、字符串、元组、布尔值。
- 可变数据类型:字典,列表
例如以下方式,都可以创建字典:
dict1={1:'小明'}
dict2={'name':'小明'}
dict3={(1,2):'小明'}
dict4={False:'小明'}
print(dict1,dict2,dict3,dict4)
>>>{1: '小明'} {'name': '小明'} {(1, 2): '小明'} {False: '小明'}
- ②字典的键不允许重复
- 如果字典里面的键重复了,后面键的值会覆盖前面键的值:
dict1 = {'name':'小蓝','name':'小绿'}
print(dict1)
>>>{'name': '小绿'}
字典里面的值可以是任意数据类型,可以是数字、字符串、元组、布尔值,也可以是列表,甚至字典。
dict1 = {'age':1} #数字
dict2 = {'name':'小明'} #字符串
dict3 = {'data':(1,2)} #元组
dict4 = {'result':False} #布尔值
dict5 = {'name':['小明','小红']} #列表
dict6 = {'小明':{'age':21,'sex':'男'}} #字典
print(dict1)
print(dict2)
print(dict3)
print(dict4)
print(dict5)
print(dict6)
>>>{'age': 1}
{'name': '小明'}
{'data': (1, 2)}
{'result': False}
{'name': ['小明', '小红']}
{'小明': {'age': 21, 'sex': '男'}}
1.2.访问字典中的值
要获取与键相关的值,可依次指定字典名和放在方括号里的键:
dict1 = {'color':'green','piece':56,'size':'superbig'}
print(dict1['color']) #这将返回dict1中与键'color'相关联的值
print(dict1['piece']) #这将返回dict1中与键'piece'相关联的值
print(dict1['size']) #这将返回dict1中与键'size'相关联的值
>>>green
56
superbig
1.3.字典的增删改查
字典是一种可变的数据容器,所以具有增删改查的功能。
- 字典中元素是无顺序排列的
- 只能通过key来获取value
1.3.1.增加
字典是一种动态结构,在字典中,通过使用"[key]"的形式,并且给它赋值。如果这个key当前不包含在字典中,那么就会把这个key以及value同时加入到字典中。
alien_0={'color':'green','points':5}
print(alien_0)
#现在给外星人添加坐标
alien_0['x_position']=0
alien_0['y_position']=5
print(alien_0)
>>>{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 5}
{'color': 'green', 'points': 5, 'y_position': 5, 'x_position': 0}
#Python不关心键值对的添加顺序,只关心键和值的关联关系。
先创建一个空字典,有时候我们为了方便,会先创建一个空字典,然后往里面添加元素:
alien_0={}
print(alien_0)
#现在给外星人添加坐标
alien_0['y_position']=5
alien_0['x_position']=0
print(alien_0)
>>>{}
{'y_position': 5, 'x_position': 0}
1.3.2.删除
a.在字典中,我们可以使用pop()从字典中移除某个元素
alien_0={}
print(alien_0)
#现在给外星人添加坐标
alien_0['y_position']=5
alien_0['x_position']=0
print(alien_0.pop('y_position'))
print(alien_0)
>>>{}
5
{'x_position': 0}
b.也可以使用del删除字典里面的元素:
alien_0={}
print(alien_0)
#现在给外星人添加坐标
alien_0['y_position']=5
alien_0['x_position']=0
del alien_0['x_position']
print(alien_0)
>>>{}
{'y_position': 5}
c.也可以使用clear清除字典里面所有的元素:
alien_0={}
print(alien_0)
#现在给外星人添加坐标
alien_0['y_position']=5
alien_0['x_position']=0
print(alien_0)
alien_0.clear() #删除全部元素
print(alien_0)
>>>{}
{'y_position': 5, 'x_position': 0}
{}
1.3.3.修改
在字典中,通过对字典中的键重新赋值,可以修改元素
alien_0={'y_position': 5, 'x_position': 0}
print(alien_0)
alien_0['y_position']=35 #修改y_position的值
print(alien_0)
>>>{'y_position': 5, 'x_position': 0}
{'y_position': 35, 'x_position': 0}
1.3.4.查找
a.在字典中,可以通过[key]的方式查询字典中的元素:
alien_0={'x_position': 5, 'y_position': 0}
result=alien_0['x_position']
print(result)
>>>5
b.使用get方法也能查找
alien_0={'x_position': 5, 'y_position': 0}
print(alien_0.get('x_position')) #使用get方法
print(alien_0['x_position']) #直接获取
#那么这两种方法的区别在哪儿
#当查找的键值不存在时
print(alien_0.get('color')) #返回值是None
print(alien_0['color']) #会报错
>>>5
5
None
KeyError: 'color'
1.4.由类似对象组成的字典
在前面的示例中,字典存储的都是一个对象的多种信息,但我们可以用字典来存储众多对象的同一种信息。
例如,你要调查很多人,询问他们最喜欢的编程语言:
这是示例还演示了如何将较长的print语句分成多行,以及字典分行定义,看起来格式更好
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
print(favorite_language)
#获取sarah最喜欢的语言
print('sarah最喜欢的语言是:'+
favorite_language.get('sarah').lower())
>>>{'jen': 'C', 'sarah': 'Python', 'edward': 'Ruby', 'phil': 'Python'}
sarah最喜欢的语言是:python
1.5.遍历字典
1.5.1.遍历所有的键-值对
字典本身提供了一个items()帮助我们遍历字典中的键值对:
items()返回一个键值对列表,接着使用for循环依次将每个键值对存储到指定的两个变量中:
(无序的字典,遍历返回顺序和存储顺序可能是不一样的)
user_0={
'username':'username',
'age':25,
'sex':'男'
}
print(user_0.items())
print(user_0.keys())
print(user_0.values())
#使用for循环遍历所有键值对
for key,value in user_0.items():
print(key,value)
>>>dict_items([('username', 'username'), ('age', 25), ('sex', '男')])
dict_keys(['username', 'age', 'sex'])
dict_values(['username', 25, '男'])
username username
age 25
sex 男
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
#使用for循环遍历所有键值对
#打印出每个人喜欢的语言
for key,value in favorite_language.items():
print(key.title()+'最喜欢的语言是:'+value)
>>>Jen最喜欢的语言是:C
Sarah最喜欢的语言是:Python
Edward最喜欢的语言是:Ruby
Phil最喜欢的语言是:Python
1.5.2.遍历字典中的所有键
字典本身提供了一个keys()帮助我们遍历字典中的键:
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
#使用for循环遍历所有键值对
#打印出每个人喜欢的语言
for key in favorite_language.keys():
print('被调查者的名字是'+key.title())
>>>被调查者的名字是Jen
被调查者的名字是Sarah
被调查者的名字是Edward
被调查者的名字是Phil
遍历字典时,会默认遍历所有的键,因此将上述代码中 for key in favorite_language.keys() 改成 for name in favorite_language,输出将不变,但使用keys()方法更容易理解一些,你可以选择这样做,也可以选择不这样做。
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
#使用for循环遍历所有键值对
#打印出每个人喜欢的语言
for key in favorite_language:
print('被调查者的名字是'+key.title())
>>>被调查者的名字是Jen
被调查者的名字是Sarah
被调查者的名字是Edward
被调查者的名字是Phil
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
friends=['jen','sarah']
#使用for循环遍历所有键值对
#打印出每个人喜欢的语言
for key in favorite_language.keys():
print(key.title())
#在这种循环方式里,可以使用当前键来访问与之相关联的值
if key in friends:
print(key+'是我的朋友')
>>>Jen
jen是我的朋友
Sarah
sarah是我的朋友
Edward
Phil
你还可以使用keys()确认某人是否接受了调查
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
if 'erin' not in favorite_language.keys():
print('erin没有接受调查')
else:
print('erin接受了调查')
>>>erin没有接受调查
所以,方法keys()并非只能用于遍历,实际上,它返回一个列表,其中包含字典的所有键
1.5.3.按顺序遍历字典中所有的键
字典总是明确的记录键与值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的,我们可以使用sortde()来获得特定顺序排列的键。
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
for key in sorted(favorite_language.keys()):
print(key)
>>>edward
jen
phil
sarah
1.5.4.遍历字典中所有的值
字典本身提供了一个values()帮助我们遍历字典中的值:(它返回一个值列表,而不包含任何键)
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
#获取所有最喜欢的语言
for value in sorted(favorite_language.values()):
print(value)
>>>C
Python
Python
Ruby
这种方法提取字典中所有的值,而没有考虑是否重复,涉及的值很少时,这也许不是问题,但是如果被调查者很多,最终的列表可能包含大量的重复项,为剔除重复项,可使用集合set(),集合类似于列表,但每个元素必须是独一无二的:
favorite_language={
'jen':'C',
'sarah':'Python',
'edward':'Ruby',
'phil':'Python'
}
#调用set()
#可以让Python找出列表中独一无二的元素,并使用这些元素来创建一个集合
for value in sorted(set(favorite_language.values())):
print(value)
>>>C
Python
Ruby
1.6.字典的嵌套使用
1.6.1.列表中存储字典
将字典放入列表中:
alien_0={'color':'green','points':5}
alien_1={'color':'yellow','points':10}
alien_2={'color':'red','points':15}
#我们将三个字典都放到一个名为alien的列表中
aliens=[alien_0,alien_1,alien_2]
for alien in aliens:
print(alien)
>>>{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
我们使用range()代码自动生成30个外星人
#创建一个空列表用于存储外星人
aliens=[]
#创建30个绿色外星人
for i in range(30):
aliensi={'color':'green','points':5,'speed':'slow'}
aliens.append(aliensi)
#显示前五个外星人
for alien in aliens[0:5]:
print(alien)
print('...')
#显示创建了多少个外星人
print(len(aliens))
>>>{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
...
30
我们可以发现,当我们使用列表存储字典时,可以进行统计,每个外星人都时独立的,让我们可以独立的修改每个外星人,而且很方便的创建了30个字典。
经常需要在列表中包含大量的字典,例如你可能需要为网站的每个用户创建一个字典,并将这些字典储存在一个名为users的列表中。
user_1={
'name':'小明',
'age':18,
'sex':'男'
}
user_2={
'name':'小红',
'age':16,
'sex':'女'
}
users=[user_1,user_2]
#打印用户数量
print(len(users))
#打印每个用户的详细信息
for user in users:
print(user['name'])
for key,value in user.items():
if key != 'name':
print(key,value)
>>>2
小明
age 18
sex 男
小红
age 16
sex 女