Python基础教程 学习笔记 第四章字典

本文深入探讨了Python中字典的基本概念、创建与使用方法,包括字典的创建、基本操作及各种字典方法的详细解释,如clear、copy、fromkeys等。通过实例展示了字典在实际应用中的灵活性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



字典是一种映射

一,创建和使用字典(dict)

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

字典=多个项的集合,
项(item)=键(key)+值(value)


注意 在字典(以及其他映射类型)中,键必须是独一无二的,而字典中的值无需此。


函数(类)dict:

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

>>> items = [('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'

②还可使用关键字实参来调用这个函数,如下所示:

>>> d = dict(name='Gumby', age=42)
>>> d
{'age': 42, 'name': 'Gumby'}

像函数 list 、 tuple 和 str 一样,如果调用这个函数时没有提供任何实参,将返回一个空字典。

二,基本的字典操作

① len(d) 返回字典 d 包含的项(键-值对)数。
② d[k] 返回与键 k 相关联的值。
③ d[k] = v 将值 v 关联到键 k 。
④ del d[k] 删除键为 k 的项。
⑤ k in d 检查字典 d 是否包含键为 k 的项
⑥ 自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。
⑦#将字符串格式设置功能用于字典

>>>phonebook={'Alice':2341,"Ben":'9102','Kitte':4517,2:5412}
>>>"Alice's phone is : {Alice}".format_map(phonebook)
2341

相比于检查列表是否包含指定的值,检查字典是否包含指定的键的效率更高。数据结构越大,效率差距就越大。


# 一个简单的数据库
# 一个将人名用作键的字典。每个人都用一个字典表示,
# 字典包含键'phone'和'addr',它们分别与电话号码和地址相关联
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
# 电话号码和地址的描述性标签,供打印输出时使用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name: ')
# 要查找电话号码还是地址?
request = input('Phone number (p) or address (a)? ')
# 使用正确的键:
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# 仅当名字是字典包含的键时才打印信息:
if name in people: print("{}'s {} is {}.".format(name, labels[key], people[name][key]))

结果:

Name: Beth
Phone number (p) or address (a)? p
Beth's phone number is 9102.

三,字典方法

3.1.clear

clear 删除所有的字典项,什么都不返回(或者说返回 None)

d={'Alice':7452,'Peter':9652,'Ben':4525}
print("d = {}".format(d))
print(d.clear())
print("d = {}".format(d))

结果:

d = {'Peter': 9652, 'Ben': 4525, 'Alice': 7452}
None
d = {}

3.2.copy

copy返回一个新字典,其包含的键-值对与原来的字典相同(这个方法执行的是浅复制)

x={'name':'Alice','id':9652,'machines': ['foo', 'bar', 'baz']}
print("x = {}".format(x))
y=x.copy()
y['name']='Peter'
y['id']=1234
y['machines'].remove('bar')
#x['machines']与y['machines']仍指向同一个列表
 
print("x = {}".format(x))
print("y = {}".format(y))

运行结果

x = {'name': 'Alice', 'machines': ['foo', 'bar', 'baz'], 'id': 9652}
x = {'name': 'Alice', 'machines': ['foo', 'baz'], 'id': 9652}
y = {'name': 'Peter', 'machines': ['foo', 'baz'], 'id': 1234}


深复制用copy模块里的deepcopy函数

from copy import deepcopy
x={'name':'Alice','id':9652,'machines': ['foo', 'bar', 'baz']}
print("x = {}".format(x))
y=deepcopy(x)
y['name']='Peter'
y['id']=1234
y['machines'].remove('bar')

print("x = {}".format(x))
print("y = {}".format(y))

运行结果:

x = {'name': 'Alice', 'machines': ['foo', 'bar', 'baz'], 'id': 9652}
x = {'name': 'Alice', 'machines': ['foo', 'bar', 'baz'], 'id': 9652}
y = {'name': 'Peter', 'machines': ['foo', 'baz'], 'id': 1234}


尝试使用dict进行复制(构造)—结果与copy一致,浅复制

x={'name':'Alice','id':9652,'machines': ['foo', 'bar', 'baz']}
print("x = {}".format(x))
y=dict(x)
y['name']='Peter'
y['id']=1234
y['machines'].remove('bar')
 
print("x = {}".format(x))
print("y = {}".format(y))

运行结果:

x = {'name': 'Alice', 'machines': ['foo', 'bar', 'baz'], 'id': 9652}
x = {'name': 'Alice', 'machines': ['foo', 'baz'], 'id': 9652}
y = {'name': 'Peter', 'machines': ['foo', 'baz'], 'id': 1234}

3.3.fromkeys

fromkeys 创建一个新字典,其中包含指定的键,且每个键对应的值默认都是None
可在第二个参数提供默认值

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

3.4.get

get 使用get来访问(读取)不存在的键时,不会引发异常,而是返回 None
可第二个参数指定“默认”返回值
若存在这一项,则与普通字典查找效果一样

>>> print(d.get('name'))
None
>>> d.get('name', 'N/A')
'N/A'
>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'

3.5.items

items 返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式.
#字典项在列表中的排列顺序不确定
#!!!返回值属于一种名为字典视图的特殊类型,可迭代,确定其长度以及对其执行成员资格检查

>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.items()
dict_items([('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')])
>>> it = d.items()
>>> len(it)
3
>>> ('spam', 0) in it
True

视图的一个优点是不复制,它们始终是底层字典的反映,即便你修改了底层字典亦如此

>>> d['spam'] = 1
>>> ('spam', 0) in it
False
>>> d['spam'] = 0
>>> ('spam', 0) in it
True

也可用list直接用视图生成一个列表

>>> list(d.items())
[('spam', 0), ('title', 'Python Web Site'), ('url','http://www.python.org')]
#区别:
>>> list(d)
['spam','title','url']

3.6.keys,values

①keys:
keys 返回一个字典视图,其中包含指定字典中的键

>>> d={'Alice':7452,'Peter':9652,'Ben':4525}
>>> d.keys()
dict_keys(['Alice', 'Peter', 'Ben'])

②values
方法 values 返回一个由字典中的值组成的字典视图。不同于方法 keys ,方法 values 返回的视图可能包含重复的值。

>>> d={'Alice':7452,'Peter':9652,'Ben':4525,'kitte':9652}
>>> d.values()
dict_values([7452, 9652, 4525, 9652])

3.7.pop

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

>>> d={'Alice':7452,'Peter':9652,'Ben':4525}
>>> d.pop('Peter')
9652
>>> d
{'Alice': 7452, 'Ben': 4525}
>>> 

3.8.popitem

popitem 随机地弹出(删除)一个字典项
#若想方法popitem以可预测的顺序弹出字典项,请参阅模块collections中的OrderedDict类

>>> d={'Alice':7452,'Peter':9652,'Ben':4525}
>>> d.popitem()
('Ben', 4525)
>>> d
{'Alice': 7452, 'Peter': 9652}

3.9.setdefault

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

>>> d={'Alice':7452,'Peter':9652,'Ben':4525}
>>> d.setdefault('Kitte',6666)
6666
>>> d
{'Alice': 7452, 'Peter': 9652, 'Ben': 4525, 'Kitte': 6666}

拓展提示:如果希望有用于整个字典的全局默认值,请参阅模块 collections 中的 defaultdict 类。


3.10.update

update 使用一个字典中的项()来更新另一个字典 (调用方式和dict一样)
#参数可是:一个映射、一个由键-值对组成的序列(或其他可迭代对象)或关键字参数
#如果当前字典包含键相同的项,就替换它

>>> d={'Alice':7452,'Peter':9652,'Ben':4525}
>>> x={'Alice':1342,'Kitte':6666}
>>> d.update(x)
>>> d
{'Alice': 1342, 'Peter': 9652, 'Ben': 4525, 'Kitte': 6666}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值