Python数据类型—字典dict


目录

可通过名称来访问其各个值的数据结构。这种数据结构称为映射(mapping)。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。

创建和使用字典

字典以类似于下面的方式表示:

phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

字典由键及其相应的值组成,这种键-值对称为项(item)。在前面的示例中,键为名字,而
值为电话号码。每个键与其值之间都用冒号( : )分隔,项之间用逗号分隔,而整个字典放在花
括号内。空字典(没有任何项)用两个花括号表示,类似于下面这样: {} 。

在字典中,键是独一无二的,值可以重复

直接创建字典

# 创建字典——直接创建
item_dic = {
    "name":"Gumdy",
    "age":32
}

print(item_dic) # {'name': 'Gumdy', 'age': 32}

使用dict类创建

可使用函数 dict从其他映射(如其他字典)或键-值对序列创建字典。

# 创建字典——从其他序列创建
items = [('name','Gumdy'),('age',32)]
item_dic = dict(items)

print(item_dic) # {'name': 'Gumdy', 'age': 32}

还可使用关键字实参数:

# 创建字典——dict+关键字参数
items = dict(name = 'Gumby',age = 32)
item_dic = dict(items)

print(item_dic) # {'name': 'Gumdy', 'age': 32}

基本的字典操作

  • len(d) 返回字典 d 包含的项(键-值对)数。
  • d[k] 返回与键 k 相关联的值。
  • d[k] = v 将值 v 关联到键 k 。
  • del d[k] 删除键为 k 的项。
  • k in d 检查字典 d 是否包含键为 k 的项。
# 学生成绩单
student_report = {'Alice': '100', 'Beth': '98', 'Cecil': '54'}

# 字段项长度
print(len(student_report))	# 3

# 返回键为Alice的值
print(student_report['Alice'])	# 100

# 设置键为Cecil的值
student_report['Cecil'] = '87'	# {'Alice': '100', 'Beth': '98', 'Cecil': '87'}
print(student_report)
# 如果键不存在,会创建新项
student_report['Juny'] = '92'	
print(student_report)	# {'Alice': '100', 'Beth': '98', 'Cecil': '87', 'Juny': '92'}

# 删除键为Beth的项
del student_report['Beth']
print(student_report)	# {'Alice': '100', 'Cecil': '87', 'Juny': '92'}

# 判断键是否存在
print('Beth' in student_report)	 # False
print('Juny' in student_report)	# True

注意事项

键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变
的类型,如浮点数(实数)、字符串或元组。
自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。

将字符串格式设置功能用于字典

可使用 format_map 来指出你将通过一个映射来提供所需的信息。

phonebook = {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}

print("Cecil's phone number is {Cecil}.".format_map(phonebook)) # Cecil's phone number is 3258.

像这样使用字典时,可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键。在模板系统中,这种字符串格式设置方式很有用(下面的示例使用的是HTML):

template = '''
<head><title>{title}</title></head>
<body>
    <h1>{title}</h1>
    <p>{text}</p>
</body>
'''
data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}

print(template.format_map(data))

"""
<head><title>My Home Page</title></head>
<body>
    <h1>My Home Page</h1>
    <p>Welcome to my home page!</p>
</body>
"""

字典常用方法

clear

使用clear() 清除字典所有项。

# clear 
student_report = {
    'Alice': 100,
    'Beth': 100, 
    'Gumy': 89, 
    'Cecil': 98
    }

student_report.clear()

print(student_report) # {}

copy

方法 copy 返回一个新字典,其包含的键-值对与原来的字典相同(这个方法执行的是浅复制,
因为值本身是原件,而非副本)。

# copy
x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}

y = x.copy()

y['username'] = 'mlh'
y['machines'].remove('bar')

print(y)
print(x)
# {'username': 'mlh', 'machines': ['foo', 'baz']}
# {'username': 'admin', 'machines': ['foo', 'baz']}

如上所见,当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值(如这个示例中的’machines’列表所示)。

为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块copy中的函数deepcopy。

from copy import deepcopy 
d = {} 
d['names'] = ['Alfred', 'Bertrand'] 
c = d.copy() 
dc = deepcopy(d) 
d['names'].append('Clive') 
print(c)	# {'names': ['Alfred', 'Bertrand', 'Clive']} 
print(dc)	# {'names': ['Alfred', 'Bertrand']}

引用、浅拷贝、深拷贝原理对比(原文

Python数据类型—字典dict

fromkeys

方法 fromkeys 创建一个新字典,其中包含指定的键,且每个键对应的值都是 None 。

>>> {}.fromkeys(['name', 'age'])
>>> {'age': None, 'name': None}

这个示例首先创建了一个空字典,再对其调用方法 fromkeys 来创建另一个字典,这显得有点多余。你可以不这样做,而是直接对 dict调用方法 fromkeys 。

>>> dict.fromkeys(['name', 'age'])
>>> {'age': None, 'name': None}

如果你不想使用默认值 None ,可提供特定的值。

>>> dict.fromkeys(['name', 'age'], '(unknown)')
>>> {'age': '(unknown)', 'name': '(unknown)'}

get

方法 get 为访问字典项提供了宽松的环境。

通常,如果你试图访问字典中没有的项,将引发错误。

>>> d = {}
>>> print(d['name'])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'name'

使用 get 来访问不存在的键时,没有引发异常,而是返回 None 。

>>> print(d.get('name'))
None

你可指定默认值,这样将返回你指定的值而不是 None 。

>>> d.get('name', 'N/A')
'N/A'

如果字典包含指定的键, get 的作用将与普通字典查找相同。

>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'

items

方法 items 返回一个包含所有字典项的列表,其中每个元素都为 (key, value) 的形式。字典项在列表中的排列顺序不确定。

d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0,'dic':{'name':'li','age':32}}
dict_items = d.items()
print(dict_items)

输出:

dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('spam', 0), ('dic', {'name': 'li', 'age': 32})])

返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。

keys

方法 keys 返回一个字典视图,其中包含指定字典中的键。

student_report = {'Alice': 100, 'Beth': 98, 'Cecil': 54}

keys = student_report.keys()
print(keys)
# dict_keys(['Alice', 'Beth', 'Cecil'])

values

方法 values 返回一个由字典中的值组成的字典视图

student_report = {'Alice': 100, 'Beth': 98, 'Cecil': 54}

values = student_report.values()
print(values)
# dict_values([100, 98, 54])

pop

方法 pop 可用于获取与指定键相关联的值,并将该键-值对从字典中删除。

student_report = {'Alice': 100, 'Beth': 98, 'Cecil': 54}

student_report.pop('Alice')
print(student_report) 
# {'Beth': 98, 'Cecil': 54}

popitem

方法 popitem 类似于 list.pop ,但 list.pop 弹出列表中的最后一个元素,而 popitem 随机地弹
出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。

student_report = {'Alice': 100, 'Beth': 98, 'Cecil': 54}

i = student_report.popitem()
print(i)	# ('Cecil', 54)
print(student_report) # {'Alice': 100, 'Beth': 98}

setdefault

方法 setdefault 有点像 get ,因为它也获取与指定键相关联的值,但除此之外, setdefault 还在字典不包含指定的键时,在字典中添加指定的键-值对。

>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name', 'N/A')
'Gumby'
>>> d
{'name': 'Gumby'}

如果指定的键存在,就返回其值,并保持字典不变。与 get 一样,值是可选的;如果没有指定,默认为 None 。

>>> d = {}
>>> print(d.setdefault('name'))
None
>>> d
{'name': None}

update

方法 update 使用一个字典中的项来更新另一个字典。

d = {'title': 'Python Web Site','url': 'http://www.python.org','changed': 'Mar 14 22:09:15 MET 2016'}
x = {'title': 'Python Language Website','date':'2022-6-10'}
d.update(x)

print(d)
# {'title': 'Python Language Website', 'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2016', 'date': '2022-6-10'}

对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它。

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/272687.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论