首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python基础教程 基本的字典操作

4.2.2 基本的字典操作

字典的基本行为在很多方面都类似于序列。

 len(d)返回字典d包含的项(键值对)数。

 d[k]返回与键k相关联的值。

 d[k] = v将值v关联到键k。

 del d[k]删除键为k的项。

 k in d检查字典d是否包含键为k的项。

虽然字典和列表有多个相同之处,但也有一些重要的不同之处。

 键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变

的类型,如浮点数(实数)、字符串或元组。

 自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不使用append或其他类似的方法,就不能给列表中没有的元素赋值。

 成员资格:表达式k in d(其中d是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易。

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

前述第一点(键可以是任何不可变的类型)是字典的主要优点。第二点也很重要,下面的示例说明了这种差别:

>>> x = []

>>> x[42] = 'Foobar'

Traceback (most recent call last):

File "", line 1, in ?

IndexError: list assignment index out of range

>>> x = {}

>>> x[42] = 'Foobar'

>>> x

首先,我尝试将字符串'Foobar'赋给一个空列表中索引为42的元素。这显然不可能,因为没有这样的元素。要让这种操作可行,初始化x时,必须使用[None] * 43之类的代码,而不能使用[]。然而,接下来的尝试完全可行。这次我将'Foobar'赋给一个空字典的键42;如你所见,这样做一点问题都没有:在这个字典中添加了一个新项,我得逞了。

代码清单4-1列出了创建电话簿数据库的代码。

代码清单4-1 字典示例

# 一个简单的数据库

# 一个将人名用作键的字典。每个人都用一个字典表示,

# 字典包含键'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.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180905G0CMVL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券