字典
字典类似于通过联系人名字查找联系人电话号码的电话本,即把键(名字)和值(电话号码)联系在一起。注意,键必须是唯一的。并且python只能使用不可变的对象(比如字符串)来作为字典的键,但是可以将不可变或可变的对象作为字典的值。举一个简单的字典例子。
alien = {'color': 'green', 'points': 5}
键值对在字典中的标记为:d = {key1 : value1, key2 : value2 }。注意键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。字典中的键/值对是没有顺序的。如果想要一个指定的顺序,那么在使用前自行排序。
使用字典
访问字典中的值
依次指定字典名和放在方括号内的键,如下所示:
alien = {'color': 'green', 'points': 5}
print(alien_0['color'])
运行结果:
green
创建字典并修改字典中的值
创建空字典时使用一对空的花括号定义一个字典,再分行添加各个键值对。
修改字典的值可以指定字典名、键以及新的赋值。
alien = {}
alien['x_position'] = 0
alien['y_position'] = 25
print(alien)
alien['x_position'] = 25
print(alien)
运行结果:
{'x_position': 0, 'y_position': 25}
{'x_position': 25, 'y_position': 25}
添加/删除键值对
字典是一种动态结构。
添加键值对时,依次指定字典名、方括号和键、所赋的值。
删除键值对时,可使用del
语句,指定字典名和要删除的键。
alien = {'color': 'green', 'points': 5}
print(alien)
#添加键值对 x_position:0
alien['x_position'] = 0
#添加键值对 y_position:25
alien['y_position'] = 25
print(alien)
#删除键值对 color:green
del alien['color']
print(alien)
运行结果:
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'y_position': 25, 'x_position': 0}
{'points': 5, 'y_position': 25, 'x_position': 0}
遍历字典
遍历所有的键值对
user = {
'username': 'efermi',#前面有四个空格的缩进,下同
'first': 'enrico',
'last': 'fermi',
}
for key, value in user.items()
print("\nKey: " + key)
print("Value: " + value)
运行结果:
Key: last
Value: fermi
Key: first
Value: enrico
Key: username
Value: efermi
由上可知,在字典的遍历中,可以声明两个变量分别存储键值对中的键和值。字典的方法item()返回一个键值对列表。注意,在遍历字典的时候,键值对的返回顺序与存储顺序不同。python只关系键和值之间的对应关系。
遍历字典中的所有键/值
使用方法
keys()
可以遍历字典中的所有键。或者不使用方法,默认遍历字典中的键。
使用方法values()可以遍历字典中的所有值。返回一个值列表。
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
for name in favorite_languages.keys():
print(name.title())
for language in favorite_languages.values():
print(language.title())
运行结果:
Jen
Sarah
Edward
Phil
Python
C
Ruby
Python
或者不使用方法,默认遍历字典中的键。即for name in favorite_languages.keys():效果等同for name in favorite_languages:。
若需按顺序遍历,只需使用sorted()
。
嵌套
将一系列字典存储在列表中,或者将列表作为值存储在字典中,称为嵌套。
字典列表
将一系列字典存储在列表中。
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
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}
列表字典
将字典存储在列表中。
lili = {
'name': 'lili',
'phonenum': ['123', '456'],
}
print("lili's name is " + lili['name'] + " and her phonenum is ")
for num in lili['phonenum']:
print("\t" + num)
运行结果:
lili's name is lili and her phonenum is
123
456
字典中嵌套字典
存储网站用户信息可以在字典中嵌套字典,例如:
users = {
'aeinstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton',
},
'mcurie': {
'first': 'marie',
'last': 'curie',
'location': 'paris',
},
}
for username, user_info in users.items():
print("\nUsername: " + username)
full_name = user_info['first'] + " " + user_info['last']
location = user_info['location']
print("\tFull name: " + full_name.title())
print("\tLocation: " + location.title())
运行结果:
Username: aeinstein
Full name: Albert Einstein
Location: Princeton
Username: mcurie
Full name: Marie Curie
Location: Paris
常用方法
set()
:创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsMiEkvY-1600444670490)(https://i.loli.net/2019/11/07/DEIR18gt4aSKWef.png)]
输出:
clear()
:清空字典中所有的 key-value对.
例:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
print(cars) # {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
# 清空cars所有key-value对
cars.clear()
print(cars) # {}
get()
:根据 key 获取 value
注:当使用方括号语法访问并不存在的ket 是,字典会引发 KeyError错误,但如果使用 get()方法访问不存在的 key 只会简单的返回 None,不会导致错误
例:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
# 获取'BMW'对应的value
print(cars.get('BMW')) # 8.5
#使用 get()方法访问不存在的 key,返回 None
print(cars.get('PORSCHE')) # None
#使用方括号访问不存在的 key,引发 KeyError错误
print(cars['PORSCHE']) # KeyError
update()
:可使用一个字典所包含的 key-value 对来更新已有的字典.
在执行 update()方法时,如果被更新的字典中已包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去.
例:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
cars.update({'BMW':4.5, 'PORSCHE': 9.3})
print(cars)
运行结果:
{'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9'BMW':4.5, 'PORSCHE': 9.3}
iterms()
:获取字典中所有的 key-value 对
keys()
:获取所有 key
values()
:获取所有 value
例:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
# 获取字典所有的key-value对,返回一个dict_items对象
ims = cars.items()
print(type(ims)) # <class 'dict_items'>
# 将dict_items转换成列表
print(list(ims)) # [('BMW', 8.5), ('BENS', 8.3), ('AUDI', 7.9)]
# 访问第2个key-value对
print(list(ims)[1]) # ('BENS', 8.3)
# 获取字典所有的key,返回一个dict_keys对象
kys = cars.keys()
print(type(kys)) # <class 'dict_keys'>
# 将dict_keys转换成列表
print(list(kys)) # ['BMW', 'BENS', 'AUDI']
# 访问第2个key
print(list(kys)[1]) # 'BENS'
# 获取字典所有的value,返回一个dict_values对象
vals = cars.values()
# 将dict_values转换成列表
print(type(vals)) # [8.5, 8.3, 7.9]
# 访问第2个value
print(list(vals)[1]) # 8.3
setdefault()
:根据 key 来获取对应 value 的值.
注:当要获取的key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value.
例:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
# 设置默认值,该key在dict中不存在,新增key-value对
print(cars.setdefault('PORSCHE', 9.2)) # 9.2
print(cars)
# 设置默认值,该key在dict中存在,不会修改dict内容
print(cars.setdefault('BMW', 3.4)) # 8.5
print(cars)
fromkeys()
:使用给定的多个 key 创建字典,这些 key 对应的 value 默认都是 None;也可以额外传入一个参数作为默认的 value.
注:该方法一般不会使用字典对象调用,通常会使用 dict 类直接调用.
例:
# 使用列表创建包含2个key的字典
a_dict = dict.fromkeys(['a', 'b'])
print(a_dict) # {'a': None, 'b': None}
# 使用元组创建包含2个key的字典
b_dict = dict.fromkeys((13, 17))
print(b_dict) # {13: None, 17: None}
# 使用元组创建包含2个key的字典,指定默认的value
c_dict = dict.fromkeys((13, 17), 'good')
print(c_dict) # {13: 'good', 17: 'good'}
使用字典格式化字符串
如需要格式化的字符串模板中包含多个变量,后面就需要按顺序给出多个变量,这种方式对于字符串模板中包含少量变量的情形是合适的,但如果字符串模板中包含大量变量,这种按顺序提供变量的方式则有些不合适.可改为在字符串模板中按 key 指定变量,然后通过字典为字符串没有版中的 key 设置值.
例:
# 字符串模板中使用key
temp = '书名是:%(name)s, 价格是:%(price)010.2f, 出版社是:%(publish)s'
book = {'name':'疯狂Python讲义', 'price': 88.9, 'publish': '电子社'}
# 使用字典为字符串模板中的key传入值
print(temp % book)
book = {'name':'疯狂Kotlin讲义', 'price': 78.9, 'publish': '电子社'}
# 使用字典为字符串模板中的key传入值
print(temp % book)
运行结果:
书名是:疯狂Python讲义, 价格是:0000088.90, 出版社是:电子社
书名是:疯狂Kotlin讲义, 价格是:0000078.90, 出版社是:电子社