文章目录
前言
1. 字典方法
1.1 clear
dict.clear():删除字典内所有元素
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print("删除前:", dict1) # 删除前: {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1.clear()
print("删除后:", dict1) # 删除后: {}
1.2 copy
dict.copy():返回一个字典的浅复制
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict2 = dict1.copy()
print(dict2) # {'name': 'niu', 'age': 10, 'gender': 'male'}
注释:dict.copy()和直接通过“=”赋值的区别 [1]
- dict.copy()是浅拷贝,即拷贝父对象,不会拷贝对象的内部的子对象。通俗点讲,父对象指向不同的内存地址,因此是两个独立的对象,一方的改变不会影响另外一方;而子对象指向同一内存地址,因此是同一对象的引用,任一方的改变都会影响另外一方。
- =:赋值引用,“=”左右对象指向同一内存地址,因此任一方的改变都会影响另外一方。
我们看一下下面的例子:
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict2 = dict1
dict3 = dict1.copy()
dict1['name']='daniu'
print(dict1) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
print(dict2) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
print(dict3) # {'name': 'niu', 'age': 10, 'gender': 'male'}
1.3 fromkeys
dict.fromkeys(iterable[, value]):创建一个新字典,其键为可迭代对象中的元素,其值为value中的元素
- iterable:可迭代对象,以其元素作为新创建字典的键
- value:可选参数,以其元素作为新创建字典的值,默认为None
需要注意的是,dict.fromkeys方法返回一个新字典,并不会改变原字典。
string1 = 'abc'
list1 = ['name','age','gender']
tuple1 = ('name','age','gender')
# 从字符串创建字典
print(dict.fromkeys(string1)) # {'a': None, 'b': None, 'c': None}
# 从列表创建字典
print(dict.fromkeys(list1)) # {'name': None, 'age': None, 'gender': None}
# 从元组创建字典
print(dict.fromkeys(tuple1)) # {'name': None, 'age': None, 'gender': None}
# 指定键值
print(dict.fromkeys(list1,0)) # {'name': 0, 'age': 0, 'gender': 0}
## 不能给不同的键赋值不同的值
print(dict.fromkeys(list1,['niu',10,'male'])) # {'name': ['niu', 10, 'male'], 'age': ['niu', 10, 'male'], 'gender': ['niu', 10, 'male']}
# dict.fromkeys方法不会改变原字典
dict1 = {}
dict2 = dict1.fromkeys(list1)
print(dict1) # {}
print(dict2) # {'name': None, 'age': None, 'gender': None}
1.4 get
dict.get(key, default=None):返回指定键的值
- key:字典中要查找的键
- default:如果指定的键不存在时,返回该指定的默认值
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print(dict1.get('name')) # niu
print(dict1.get('country')) # None
print(dict1.get('country','China')) # China
1.5 items
dict.items():返回字典的视图对象( view objects),其为一个可遍历的key/value 对(可迭代对象)
注释:
dict.keys()、dict.values() 和 dict.items() 返回的都是视图对象,提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。视图对象不是列表,不支持索引,可以使用 list() 来转换为列表。我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的 [2]。
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1_items = dict1.items()
print(dict1_items) # dict_items([('name', 'niu'), ('age', 10), ('gender', 'male')])
# 字典的视图对象不支持索引
dict1_items[0] # TypeError: 'dict_items' object is not subscriptable
## 用list()将视图对象转化为列表
print(list(dict1_items)) # [('name', 'niu'), ('age', 10), ('gender', 'male')]
# 字典的视图对象不支持修改
dict1_items[0] = (1,2) # TypeError: 'dict_items' object does not support item assignment
# 字典改变,视图对象也会跟着改变,即所谓的动态视图
dict1['name'] = 'daniu'
print(dict1) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
print(dict1_items) # dict_items([('name', 'daniu'), ('age', 10), ('gender', 'male')])
# 字典的视图对象为可迭代对象
for key, value in dict1_items:
print(key,value) # name daniu
# age 10
# gender male
1.6 keys
dict.keys():返回字典键的视图对象(可迭代对象)
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1_keys = dict1.keys()
print(dict1_keys) # dict_keys(['name', 'age', 'gender'])
# 字典的视图对象不支持索引
dict1_keys[0] # TypeError: 'dict_keys' object is not subscriptable
## 用list()将视图对象转化为列表
print(list(dict1_keys)) # ['name', 'age', 'gender']
# 字典的视图对象不支持修改
dict1_keys[0] = 'daniu' # TypeError: 'dict_keys' object does not support item assignment
# 字典改变,视图对象也会跟着改变,即所谓的动态视图
del dict1['name']
print(dict1) # {'age': 10, 'gender': 'male'}
print(dict1_keys) # dict_keys(['age', 'gender'])
# 字典的视图对象为可迭代对象
for key in dict1_keys:
print(key) # age
# gender
1.7 pop
dict.pop(key[,default]):删除字典给定键 key 所对应的键值对,并返回给定键 key 所对应值。
- key:要删除的键key
- default:如果要删除的键key不存在,则返回default值。此时,如果不指定default值,则会引起错误
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
# 删除键‘name’对应的键值对,并返回键‘name’对应的值
print(dict1.pop('name')) # niu
print(dict1) # {'age': 10, 'gender': 'male'}
# 如果要删除的键key不存在,则返回default值。此时,如果不指定default值,则会引起错误
print(dict1.pop('country')) # KeyError: 'country'
print(dict1.pop('country','China')) # China
1.8 popitem
dict.popitem():(随机)返回并删除字典中最后一对键值对,如果字典已经为空,则该方法会报出KeyError异常
注释:
Python 3.5之前的字典是无序的,所以字典没有“最后”或者其他关于顺序的概念。但在之后的版本中,字典是有序的,所以有“最后”的概念。
# Python 3.8,popitem方法依次返回并删除字典中最后一对键值对
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print(dict1.popitem()) # ('gender', 'male')
print(dict1) # {'name': 'niu', 'age': 10}
print(dict1.popitem()) # ('age', 10)
print(dict1) # {'name': 'niu'}
print(dict1.popitem()) # {'name': 'niu'}
print(dict1) # {}
# 如果字典已经为空,则该方法会报出KeyError异常
print(dict1.popitem()) # KeyError: 'popitem(): dictionary is empty'
# Python 2.7,popitem方法随机返回并删除字典中一对键值对
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print(dict1.popitem()) # ('gender', 'male')
print(dict1) # {'age': 10, 'name': 'niu'}
print(dict1.popitem()) # ('age', 10)
print(dict1) # {'name': 'niu'}
print(dict1.popitem()) # {'name': 'niu'}
print(dict1) # {}
# 如果字典已经为空,则该方法会报出KeyError异常
print(dict1.popitem()) # KeyError: 'popitem(): dictionary is empty'
1.9 setdefault
dict.setdefault(key, default=None):setdefault方法和get方法类似,返回指定键key对应的值value。不同的是,如果指定的键key不在字典中,则setdefault方法不仅会返回指定的default值,还会将指定的键key插入字典中,并将指定的default值作为其值
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
# 如果指定的键key在字典中,返回指定键key对应的值value
print(dict1.setdefault('name')) # niu
# 如果指定的键key不在字典中,则将指定的键key插入字典中,并将指定的default值作为其值
print(dict1.setdefault('country')) # None
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male', 'country': None}
print(dict1.setdefault('height',178)) # 178
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male', 'country': None, 'height': 178}
1.10 update
dict.update(obj,[**kargs]):用字典或可迭代对象或关键字更新字典dict,既可以用来修改已存在的键对应的值,也可以添加新的键/值对到字典中 [3] [4] [5]
- update方法会首先检查obj是否存在且有.keys()方法(一般为字典类型),如果是,那么update方法会用该映射对象来更新字典
- 否则,update方法会退一步检查obj是否是包含了键值对(key,value)元素的可迭代对象,如果是,那么update方法会用该包含了键值对(key,value)元素的可迭代对象来更新字典
- 否则,update方法会根据关键字来更新字典
# 字典
dict1 = {'name':'niu'}
dict1.update({'age': 10, 'gender': 'male'})
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
# 包含键值对的可迭代对象
## 列表、元组等可迭代对象
dict1 = {'name':'niu'}
dict1.update([('age', 10), ('gender', 'male')])
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
## 利用zip函数将键和值打包成键值对元组组成的对象
dict1 = {'name':'niu'}
dict1.update(zip(['age','gender'],[10,'male']))
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
# 用关键字的形式表示键值对
dict1 = {'name':'niu'}
dict1.update(age=10, gender='male')
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
# updata方法可以修改字典
dict1 = {'name':'niu'}
dict1.update(name='daniu')
print(dict1) # {'name': 'daniu'}
1.11 values
dict.values():返回字典值的视图对象(可迭代对象)
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1_values = dict1.values()
print(dict1_values) # dict_values(['niu', 10, 'male'])
# 字典的视图对象不支持索引
dict1_values[0] # TypeError: 'dict_values' object is not subscriptable
## 用list()将视图对象转化为列表
print(list(dict1_values)) # ['niu', 10, 'male']
# 字典的视图对象不支持修改
dict1_values[0] = 'daniu' # TypeError: 'dict_values' object does not support item assignment
# 字典改变,视图对象也会跟着改变,即所谓的动态视图
dict1['name'] = 'daniu'
print(dict1) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
print(dict1_values) # dict_values(['daniu', 10, 'male'])
# 字典的视图对象为可迭代对象
for value in dict1_values:
print(value) # daniu
# 10
# male
2. 字典操作
2.1 基础操作
2.1.1 创建
2.1.1.1 {}创建字典
{key1 : value1, key2 : value2, key3 : value3 }:将键值对(key/value)置于花括号“{}”中,键值对之间用逗号“,”隔开,每对键值对的键key与值value之间用冒号“:”隔开
# 创建空字典
dict1 = {}
# 赋值创建字典
## 字典的值可以是任何数据类型,但字典的键必须是不可变的,如字符串,数字,且键必须是唯一的
dict2 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict3 = {'name': ['niu','daniu'], 'age': 10, 'gender': 'male'} # 值可以是任何数据类型
dict4 = {1:'one',2: 'two', 3: 'three'} # 键可以是数字
## 列表是可变的,因此不能作为字典的键
dict5 = {['name']:'niu'} # TypeError: unhashable type: 'list'
## 但是元组可以
dict6 = {('name',):'niu'}
# 字典的键必须唯一,如果字典的键重复出现,新出现的值会覆盖之前的值
dict7 = {'name': 'niu', 'age': 10, 'gender': 'male','name':'daniu'}
print(dict7) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
2.1.1.2 dict()创建字典
dict(,[mapping,[iterable,[**kwargs]]]):dict()函数和dict.update()方法的使用方法类似,接受映射对象(字典)、包含键值对(key,value)元组的可迭代对象或关键字,返回创建的字典
# 创建空字典
dict1 = dict()
print(dict1) # {}
# 映射对象(字典)
dict2 = dict({'name': 'niu', 'age': 10, 'gender': 'male'})
print(dict2) # {'name': 'niu', 'age': 10, 'gender': 'male'}
# 包含键值对(key,value)元组的可迭代对象
dict3 = dict([('name','niu'),('age',10),('gender','male')])
print(dict3) # {'name': 'niu', 'age': 10, 'gender': 'male'}
## zip函数(Pythonic的方法)
dict4 = dict(zip(['name','age','gender'],['niu',10,'male']))
print(dict4) # {'name': 'niu', 'age': 10, 'gender': 'male'}
# 关键字
dict5 = dict(name='niu',age=10,gender='male')
print(dict5) # {'name': 'niu', 'age': 10, 'gender': 'male'}
2.1.1.3 fromkeys
详见第1.3节。
2.1.1.4 字典推导式/生成式
{key表达式: value表达式 for key, value in 键值对可迭代对象 [if 条件表达式]},if条件表达式为可选参数。字典推导式和列表推导式基本一样,除了中括号变为大括号
list1 = [('name','niu'),('age',10),('gender','male')]
dict1 = {key:value for key, value in list1}
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
2.1.1.5 循环创建字典
dict[key]=value:通过这样的方式可以不断将新的键值对加入字典中
dict1 = {}
keys = ['name','age','gender']
values = ['niu',10,'male']
for index in range(len(keys)):
dict1[keys[index]] = values[index]
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male'}
2.1.2 访问
2.1.2.1 dict[key]
和列表不同,字典没有索引和切片方法,但是可以通过键key访问对应的值value。当被访问的键key不在字典中时,则会引起错误
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print(dict1['name']) # niu
print(dict1['country']) # KeyError: 'country'
2.1.2.2 get、setdefault方法
详见第1.4、1.9节。
2.1.2.3 items、keys、values方法
详见第1.5、1.6、1.11节。
2.1.3 修改
2.1.3.1 赋值修改
dict[key]=new_value:将key映射到new_value上
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1['name'] = 'daniu'
print(dict1) # {'name': 'daniu', 'age': 10, 'gender': 'male'}
注释:
只能修改键key对应的值,无法修改键key本身。
2.1.3.2 update方法
详见第1.10节。
注释:
一般情况下,更推荐通过赋值的方式对字典进行直接修改,因为这样的方式效率更高 [6]。
2.1.4 增加
2.1.4.1 赋值添加
dict[new_key]=value:将新的键值对加入到字典中
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
dict1['country'] = 'China'
print(dict1) # {'name': 'niu', 'age': 10, 'gender': 'male', 'country': 'China'}
注释:
对于字典,即使键key原本并不在字典中,也可以为其赋值,因为字典会自动将该键值对加入到字典中。但是对于列表,我们无法直接为索引之外的位置赋值。
list1 = [1,2,3,4]
list1[4] = 5 # IndexError: list assignment index out of range
2.1.4.2 update方法
详见第1.10节。
2.1.5 删除
2.1.5.1 del
del dict[key]:删除字典中键key对应的键值对
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
del dict1['name']
print(dict1) # {'age': 10, 'gender': 'male'}
2.1.5.2 pop方法
详见第1.7节。
2.1.5.3 popitem方法
详见第1.8节。
2.1.5.4 clear方法
详见第1.1节。
2.1.6 遍历
详见第1.5节、1.6节和1.11节。
2.1.7 其他
2.1.7.1 长度
len(dict):返回字典中键值对的数目
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print(len(dict1)) # 3
2.1.7.2 成员资格
key in dict:检查指定的键key是否在字典dict中,返回布尔值
与列表、元组等不同,对于列表、元组等而言,in函数检查的是指定的值是否在列表和元组中。而对于字典而言,in函数检查的是指定的键key是否在字典中。
dict1 = {'name': 'niu', 'age': 10, 'gender': 'male'}
print('name' in dict1) # True
print('country' in dict1) # False
print('niu' in dict1) # False