字典的特点
- 字典的所有元素都是一个 key-value ,通过指定的 key 总能映射到唯一确定的 value。字典中不能存在重复的key,但是可以存在重复的value
- 字典中的元素是无序的。顺序不重要,重要的是key和value的映射关系
- 字典中的 key 必须是不可变对象。存取字典中的 key-value,系统会调用内置函数 hash 根据指定的key 计算出value的存储位置,也就是哈希值。对于指定的key,为确保每次计算出的哈希值都是相同的,要求key必须是不可变对象,也就是说,只有不可变对象才存在哈希值。
- 字典可以根据需要动态的伸缩,系统会根据需要动态的分配和回收内存,因此在使用前无须预先声明字典容量。
- 字典会浪费较大内存,与列表相比,是用空间换取了时间
字典的创建
创建字典的常见方式有3种:
# 1、使用花括号
print({'name': 'Jack', 'age': 18}) # {'name': 'Jack', 'age': 18}
# 空字典
print({}) # {}
# 2、调用内置函数dict
print(dict({'name': 'Jack', 'age': 18})) # {'name': 'Jack', 'age': 18}
print(dict(name='Jack', age=18)) # {'name': 'Jack', 'age': 18}
print(dict([('name', 'Jack'), ('age', 18)])) # {'name': 'Jack', 'age': 18}
print(dict(zip(range(3), 'ABC'))) # {0: 'A', 1: 'B', 2: 'C'}
# 空字典
print(dict()) # {}
# 3、调用 dict 的方法 fromKeys
# 调用该方法时通过参数指定所有的key,所有value的默认值都是None
print(dict.fromkeys(['name', 'age'])) # {'name': None, 'age': None}
print(dict.fromkeys(('name', 'age'))) # {'name': None, 'age': None}
# 调用该方法时,可以通过参数指定所有value的值
print(dict.fromkeys(['name', 'age'], 'N/A')) # {'name': 'N/A', 'age': 'N/A'}
字典的 “查” 操作
# 1、使用中括号
d = {'name': 'Jack', 'age': 18}
print(d['name']) # Jack
# 如果字典中不存在指定的key,抛出 KeyError
# print(d['gender']) # KeyError: 'gender'
# 2、调用方法get
print(d.get('name')) # Jack
# 如果字典中不存在指定的key,返回 None
print(d.get('gender')) # None
# 调用get方法时可以通过参数指定默认 value,在key不存在时将其返回
print(d.get('gender', '男')) # 男
# 可以使用运算符 in (not in) 来检查字典中是否存在指定的 key
print('age' in d) # True
print('gender' in d) # False
print('gender' not in d) # True
字典的 “改” 操作
# 1、为已经存在的 key 赋予一个 value 值,一次只修改一个key对应的value
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
d['age'] = 20
print(d) # {'name': 'Jack', 'age': 20, 'gender': '男'}
# 2、调用方法 update() ,第一至少修改一个key对应的value
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
d.update({'name': 'Mike', 'age': 20})
# d.update([('name', 'Mike'), ('age', 20)])
# d.update(name='Mike', age=20)
print(d) # {'name': 'Mike', 'age': 20, 'gender': '男'}
字典的 “增” 操作
# 1、为不存在的key赋予一个value值,一次只添加一个key-value对
d = {'name': 'Jack', 'age': 18}
d['gender'] = '男'
print(d) # {'name': 'Jack', 'age': 18, 'gender': '男'}
# 2、调用方法update,一次至少添加一个key-value对
d = {'name': 'Jack', 'age': 18}
d.update({'gender': '男', 'score': 90})
d.update([('gender', '男'), ('score', 90)])
d.update(gender='男', score=90)
print(d) # {'name': 'Jack', 'age': 18, 'gender': '男', 'score': 90}
字典的 “删” 操作
# 1、调用方法 pop ,一次只删除一个指定的key-value对
# 该方法返回指定的 key 对应的 value
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
print(d.pop('age')) # 18
print(d) # {'name': 'Jack', 'gender': '男'}
# 如果指定的key不存在,抛出 KeyError
# d.pop('score') # KeyError: 'score'
# 为了防止指定的key不存在时抛出KeyError,我们可以通过参数指定一个默认返回的value
print(d.pop('score', 90)) # 90
print(d) # {'name': 'Jack', 'gender': '男'}
# 2、使用del语句 ,一次只删除一个指定的key-value对
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
del d['name']
print(d) # {'age': 18, 'gender': '男'}
# 3、调用方法 popitem() ,一次只删除一个任意的 key-value对
# 该方法返回被删除的 key-value对
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
print(d.popitem()) # ('gender', '男')
print(d) # {'name': 'Jack', 'age': 18}
# 4、调用方法 clear 清空字典
d = {'name': 'Jack', 'age': 18, 'gender': '男'}
d.clear()
print(d) # {}
为字典中指定的key设置默认的value值
为了确保字典中指定的key总是存在,可以调用方法 setdefault,这样:如果字典中存在指定的key,返回指定的key对应的value,字典不发生变化;如果字典不存在指定的key,该方法返回指定的默认value值,字典中添加一个key-value对
d = {'name': 'Jack'}
print(d.setdefault('name', 'defaultName')) # Jack
print(d) # {'name': 'Jack'}
print(d.setdefault('age', 18)) # 18
print(d) # {'name': 'Jack', 'age': 18}
字典的视图
得到字典相关视图的3个方法:
- keys:返回字典所有key的视图
- values:返回字典所有value的视图
- items:返回字典所有key-value对的视图
d = {'name': 'Jack', 'age': 18}
keys = d.keys()
print(keys) # dict_keys(['name', 'age'])
print(list(keys)) # ['name', 'age']
values = d.values()
print(values) # dict_values(['Jack', 18])
print(list(values)) # ['Jack', 18]
items = d.items()
print(items) # dict_items([('name', 'Jack'), ('age', 18)])
print(list(items)) # [('name', 'Jack'), ('age', 18)]
# 视图会随字典的变化而变化
d.pop('age')
print(d) # {'name': 'Jack'}
print(list(keys)) # ['name']
print(list(values)) # ['Jack']
print(list(items)) # [('name', 'Jack')]
借助字典创建格式化字符串
# 1、使用百分号作为占位符
phonebook = {'张三': 13333333333,
'李四': 14444444444,
'王五': 15555555555,
'赵六': 16666666666}
print('王五的号码:%s,张三的号码:%s' % (phonebook['王五'], phonebook['张三']))
# 王五的号码:15555555555,张三的号码:13333333333
"""
当字符串中的占位符是百分号,并且占位符对应的实际值来自于某个字典的value时,可以把所有的实际值改写为字典,
同时根据字典的value对应的key在占位符%的后面添加:字典的key,
其中,字典的key会被添加一对引号。因此,如果字典的key是字符串,需要去掉字典的key自带的引号
"""
print('王五的号码:%(王五)s,张三的号码:%(张三)s' % phonebook)
# 王五的号码:15555555555,张三的号码:13333333333
# 2、使用花括号作为占位符
print('王五的号码:{},张三的号码:{}'.format(phonebook['王五'], phonebook['张三']))
# 王五的号码:15555555555,张三的号码:13333333333
print('王五的号码:{王五},张三的号码:{张三}'.format_map(phonebook))
# 王五的号码:15555555555,张三的号码:13333333333