前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: dict字典的方法介绍

Python: dict字典的方法介绍

作者头像
Exploring
发布2022-09-20 14:08:40
9400
发布2022-09-20 14:08:40
举报
文章被收录于专栏:数据处理与编程实践

文章背景: 字典(dict)是Python中一个重要的数据类型。下面打算对dict的内置方法进行介绍。

Python版本:Python 3.7

我们可使用 dir(dict) 来查看字典类型包含的属性和内置方法。

代码语言:javascript
复制
print(dir(dict))
代码语言:javascript
复制
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

可以看出,目前字典(dict)共有11个内置方法。

1 fromkeys()方法2 keys()、values() 和 items() 方法3 get()方法4 setdefault() 方法 5 pop() 和 popitem() 方法 6 update() 方法7 clear() 方法8 copy() 方法

1 fromkeys()方法

创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值。

dictname = dict.fromkeys(list,value=None)

其中,list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。

代码语言:javascript
复制
knowledge = ['语文', '数学', '英语']
scores = dict.fromkeys(knowledge, 60)
print(scores)
代码语言:javascript
复制
{'语文': 60, '数学': 60, '英语': 60}

除了使用 fromkeys() 方法创建字典外,还有如下两种方式。

(1)使用 { } 创建字典

dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}

其中 dictname 表示字典变量名,keyn : valuen 表示各个元素的键值对。需要注意的是,同一字典中的各个键必须唯一,不能重复。

代码语言:javascript
复制
# 使用字符串作为key
scores = {'数学': 95, '英语': 92, '语文': 84}
print(scores)

# 使用元组和数字作为key
dict1 = {(20, 30): 'great', 30: [1, 2, 3]}
print(dict1)

# 创建空元组
dict2 = {}
print(dict2)
代码语言:javascript
复制
{'数学': 95, '英语': 92, '语文': 84}
{(20, 30): 'great', 30: [1, 2, 3]}
{}

(2)通过 dict() 映射函数创建字典

通过 dict() 函数创建字典的写法有多种,下面列出常用的几种方式,它们创建的都是同一个字典 a。

方式一:

代码语言:javascript
复制
a = dict(str1="value1", str2="value2", str3="value3")
print(a)
代码语言:javascript
复制
{'str1': 'value1', 'str2': 'value2', 'str3': 'value3'}

str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号

方式二:

代码语言:javascript
复制
# 1
demo1 = [('two', 2), ('one', 1), ('three', 3)]
# 2
demo2 = [['two', 2], ['one', 1], ['three', 3]]
# 3
demo3 = (('two', 2), ('one', 1), ('three', 3))
# 4
demo4 = (['two', 2], ['one', 1], ['three', 3])

a1 = dict(demo1)
a2 = dict(demo2)
a3 = dict(demo3)
a4 = dict(demo4)
print(a1)
print(a2)
print(a3)
print(a4)
代码语言:javascript
复制
{'two': 2, 'one': 1, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}

向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。

方式三:

代码语言:javascript
复制
keys = ['one', 'two', 'three']  # 还可以是字符串或元组
values = [1, 2, 3]              # 还可以是字符串或元组
a = dict(zip(keys, values))
print(a)
代码语言:javascript
复制
{'one': 1, 'two': 2, 'three': 3}

通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。

如果不为 dict() 函数传入任何参数,则代表创建一个空的字典。

代码语言:javascript
复制
# 创建空的字典
d = dict()
print(d)
代码语言:javascript
复制
{}
2 keys()、values() 和 items() 方法
  • keys()方法用于返回字典中的所有键(key);
  • values()方法用于返回字典中所有键对应的值(value);
  • items()方法用于返回字典中所有的键值对(items)。 scores = {'数学': 95, '语文': 89, '英语': 90} print(scores.keys()) print(scores.values()) print(scores.items()) dict_keys(['数学', '语文', '英语']) dict_values([95, 89, 90]) dict_items([('数学', 95), ('语文', 89), ('英语', 90)])

keys()、values() 和 items() 返回值的类型分别为 dict_keys、dict_values 和 dict_items,并不是我们常见的列表或者元组类型。下面通过两种方式返回数据。

(1)使用 list() 函数,将返回的数据转换成列表

代码语言:javascript
复制
a = {'数学': 95, '语文': 89, '英语': 90}
b = list(a.keys())
print(b)
代码语言:javascript
复制
['数学', '语文', '英语']

(2)使用 for in 循环遍历它们的返回值

代码语言:javascript
复制
a = {'数学': 95, '语文': 89, '英语': 90}
for k in a.keys():
    print(k, end=' ')
print("\n")

for v in a.values():
    print(v, end=' ')
print("\n")

for k, v in a.items():
    print("key:", k, " value:", v)
代码语言:javascript
复制
数学 语文 英语 

95 89 90 

key: 数学  value: 95
key: 语文  value: 89
key: 英语  value: 90
3 get()方法

dictname.get(key[,default])

dictname 表示字典变量的名字;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。

代码语言:javascript
复制
a = dict(two=0.65, one=88, three=100, four=-59)
print(a.get('one'))
代码语言:javascript
复制
88

当键不存在时,get() 返回空值 None,如果想明确地提示用户该键不存在,那么可以手动设置 get() 的第二个参数。

代码语言:javascript
复制
a = dict(two=0.65, one=88, three=100, four=-59)
print(a.get('five', '该键不存在'))
代码语言:javascript
复制
该键不存在
4 setdefault() 方法

dictname.setdefault(key, defaultvalue)

dictname 表示字典名称,key 表示键,defaultvalue 表示默认值(可以不写,不写的话是 None)。

当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。

也就是说,setdefault() 方法总能返回指定 key 对应的 value:

  • 如果该 key 存在,那么直接返回该 key 对应的 value;
  • 如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。
代码语言:javascript
复制
a = {'数学': 95, '语文': 89, '英语': 90}
print(a)

# key不存在,指定默认值
a.setdefault('物理', 94)
print(a)

# key不存在,不指定默认值
a.setdefault('化学')
print(a)

# key存在,指定默认值
a.setdefault('数学', 100)
print(a)
代码语言:javascript
复制
{'数学': 95, '语文': 89, '英语': 90}
{'数学': 95, '语文': 89, '英语': 90, '物理': 94}
{'数学': 95, '语文': 89, '英语': 90, '物理': 94, '化学': None}
{'数学': 95, '语文': 89, '英语': 90, '物理': 94, '化学': None}
5 pop() 和 popitem() 方法

pop() 和 popitem() 都用来删除字典中的键值对,不同的是,pop() 用来删除指定的键值对,而 popitem() 用来删除字典中最后一个键值对。

dictname.pop(key)

删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。

dictname.popitem()

返回并删除字典中的最后一对键和值。

代码语言:javascript
复制
a = {'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}
print(a, end="\n\n")

b = a.pop('化学')
print(b)
print(a, end="\n\n")

c = (a.popitem())
print(c)
print(a)
代码语言:javascript
复制
{'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}

83
{'数学': 95, '语文': 89, '英语': 90, '生物': 98, '物理': 89}

('物理', 89)
{'数学': 95, '语文': 89, '英语': 90, '生物': 98}
6 update() 方法

dict.update(dict2)

把字典dict2的键/值对更新到dict里。

在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

代码语言:javascript
复制
a = {'one': 1, 'two': 2, 'three': 3}
a.update({'one': 4.5, 'four': 9.3})
print(a)
代码语言:javascript
复制
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}

由于被更新的字典中已包含 key 为“one”的键值对,因此更新时该键值对的 value 将被改写;而被更新的字典中不包含 key 为“four”的键值对,所以更新时会为原字典增加一个新的键值对。

7 clear() 方法

dict.clear()

删除字典内所有元素。

代码语言:javascript
复制
a = {'one': 1, 'two': 2, 'three': 3}
print(a)

a.clear()
print(a)
代码语言:javascript
复制
{'one': 1, 'two': 2, 'three': 3}
{}

和删除列表、元组一样,手动删除字典也可以使用 del 关键字。

代码语言:javascript
复制
a = dict(two=0.65, one=88, three=100, four=-59)
print(a)
del a
print(a)
代码语言:javascript
复制
{'two': 0.65, 'one': 88, 'three': 100, 'four': -59}
NameError: name 'a' is not defined

Python 自带垃圾回收功能,会自动销毁不用的字典,所以一般不需要通过 del 来手动删除。

8 copy() 方法

copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典。

代码语言:javascript
复制
a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
b = a.copy()
print(b)
代码语言:javascript
复制
{'one': 1, 'two': 2, 'three': [1, 2, 3]}

copy() 方法将字典 a 的数据全部拷贝给了字典 b。

注意,copy() 方法所遵循的拷贝原理,是浅拷贝。拿拷贝字典 a 为例,copy() 方法只会对最表层的键值对进行复制,也就是说,它会再申请一块内存用来存放 {'one': 1, 'two': 2, 'three': []};而对于字典内部某些列表类型的来说,此方法对其做的是浅拷贝,也就是说,b 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。

代码语言:javascript
复制
a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
b = a.copy()

# 向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
a['four'] = 100
print(a)
print(b, end="\n\n")

# 由于 b 和 a 共享[1,2,3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(1)
print(a)
print(b)
代码语言:javascript
复制
{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}

{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}

从运行结果不难看出,对 a 增加新键值对,b 不变;而修改 a 键值对中列表内的某个元素,b也会相应改变。

关于拷贝,有三种情况,直接赋值,深拷贝和浅拷贝。

(1)直接赋值

其实就是对象的引用(别名)。

(2)浅拷贝

拷贝父对象,不会拷贝对象的内部的子对象。

copy模块的copy方法,和字典的copy()方法,都属于浅拷贝。

Shallow copying, a and b will become two isolated objects, but their contents still share the same reference.

(3)深拷贝

完全拷贝了父对象及其子对象。

copy 模块的 deepcopy 方法,属于深拷贝。

代码语言:javascript
复制
import copy

a = [1, 2, 3, 4, ['a', 'b']]  # 原始对象

b = a  # 赋值,传对象的引用
c = copy.copy(a)  # 对象拷贝,浅拷贝
d = copy.deepcopy(a)  # 对象拷贝,深拷贝

a.append(5)  # 修改对象a
a[4].append('c')  # 修改对象a中的['a', 'b']列表对象

print('a = ', a)
print('b = ', b)
print('c = ', c)
print('d = ', d)
代码语言:javascript
复制
a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c =  [1, 2, 3, 4, ['a', 'b', 'c']]
d =  [1, 2, 3, 4, ['a', 'b']]

可以看到,这里b是直接赋值,因此对a的任何操作,都会影响到bc是浅拷贝,a新增键值对,对c没有影响,但是如果修改了a中的列表对象,同样也会影响到cd是深拷贝,是完全独立的对象。

参考资料:

[1] Python3 字典(https://www.runoob.com/python3/python3-dictionary.html)

[2] Python dict字典详解(http://c.biancheng.net/view/4372.html)

[3] Python dict字典方法完全攻略(全)(http://c.biancheng.net/view/4380.html)

[4] Understanding dict.copy() - shallow or deep(https://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-or-deep)

[5] Python 直接赋值、浅拷贝和深度拷贝解析(https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 fromkeys()方法
  • 2 keys()、values() 和 items() 方法
  • 3 get()方法
  • 4 setdefault() 方法
  • 5 pop() 和 popitem() 方法
  • 6 update() 方法
  • 7 clear() 方法
  • 8 copy() 方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档