【Python】字典

前言

Python 字典
字典方法
字典操作
clear
copy
fromkeys
get
items
keys
pop
popitem
setdefault
update
values
基础操作
进阶操作
创建
访问
修改
增加
删除
遍历
其他

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

2.2 进阶操作

Reference

[1]: https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
[2]: https://www.runoob.com/python3/python3-att-dictionary-items.html
[3]: https://blog.youkuaiyun.com/weixin_33922670/article/details/92392282
[4]: https://www.runoob.com/python/python-func-dict.html
[5]: https://blog.youkuaiyun.com/sinat_38682860/article/details/107427749
[6]: https://blog.youkuaiyun.com/weixin_43946756/article/details/87865823
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值