python基础(三)字典

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

1.字典的用途

字典的名称指出了这种数据结构的用途。普通图书适合按从头到尾的顺序阅读,如果你愿意,可快速翻到任何一页,这有点像Python中的列表。字典(日常生活中的字典和Python字典)旨在让你能够轻松地找到特定的单词(键),以获悉其定义(值)。
在很多情况下,使用字典都比使用列表更合适。下面是Python字典的一些用途:

  •  表示棋盘的状态,其中每个键都是由坐标组成的元组;
  •  存储文件修改时间,其中的键为文件名;
  •  数字电话/地址簿。

字典特点

  1. 字典的键不能修改且唯一;因此字典的键不能是列表和字典
  2. 字典具有无序性,通过键去替代索引

假设有如下名单:
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl'] 
如果要创建一个小型数据库,在其中存储这些人的电话号码,该如何办呢?一种办法是再创建一个列表。假设只存储四位的分机号,这个列表将类似于:
>>> numbers = ['2341', '9102', '3158', '0142', '5551'] 
创建这些列表后,就可像下面这样查找Cecil的电话号码:
>>> numbers[names.index('Cecil')] 
'3158' 
这可行,但不太实用。实际上,你希望能够像下面这样做:
>>> phonebook['Cecil'] 
'3158' 
如何达成这个目标呢?只要phonebook是个字典就行了。


2.创建和使用字典
字典以类似于下面的方式表示:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 
字典由键及其相应的值组成,这种键值对称为项(item)。在前面的示例中,键为名字,而值为电话号码。每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,而整个字典放在花括号内。空字典(没有任何项)用两个花括号表示,类似于下面这样:{}。

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

1)函数 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'} 
尽管这可能是函数dict最常见的用法,但也可使用一个映射实参来调用它,这将创建一个字典,其中包含指定映射中的所有项。像函数list、tuple和str一样,如果调用这个函数时没有提供任何实参,将返回一个空字典。从映射创建字典时,如果该映射也是字典(毕竟字典是Python中唯一的内置映射类型),可不使用函数dict,而是使用字典方法copy。与list、tuple和str一样,dict其实根本就不是函数,而是一个类。

x = dict('a'=1,'b'=2) 入参为一个元组,类似 a = 1的键值对

x = dict((('a',1)('b',1))) 入参为一个元组,元组内部是一系列包含两个值的元组,例如(("a", "1"), ("b", "2"))

x = dict((['a',1],['b',1])) 入参为一个元组,元组内部是一系列包含两个值的列表,例如(["a", "1"], ["b", "2"])

x = dict([('a',1),('b',2)]) 入参为一个列表,列表内部是一系列包含两个值的元组,例如[("a", "1"),("b", "2")]

x = dict([["a", "1"],["b", "2"]]) 入参为一个列表,列表内部是一系列包含两个值的列表,例如[["a", "1"],["b", "2"]]

.fromkeys方法创建字典

dict.fromkeys(('a','b'),1) 第一个参数是一个列表或者元组,里边的值为key,第二个参数是所有key的value值

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 "<stdin>", line 1, in ? 
IndexError: list assignment index out of range 
>>> x = {} 
>>> x[42] = 'Foobar' 
>>> x 
{42: 'Foobar'} 
首先,我尝试将字符串'Foobar'赋给一个空列表中索引为42的元素。这显然不可能,因为没有这样的元素。要让这种操作可行,初始化x时,必须使用[None] * 43之类的代码,而不能使用[]。这次我将'Foobar'赋给一个空字典的键42;这样做一点问题都没有:在这个字典中添加了一个新项。

3)将字符串格式设置功能用于字典
可使用字符串格式设置功能来设置值的格式,这些值是作为命名或非命名参数提供给方法format的。在有些情况下,通过在字典中存储一系列命名的值,可让格式设置更容易些。例如,可在字典中包含各种信息,这样只需在格式字符串中提取所需的信息即可。为此,必须使用format_map来指出你将通过一个映射来提供所需的信息。
>>> phonebook 
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'} 
>>> "Cecil's phone number is {Cecil}.".format_map(phonebook) 
"Cecil's phone number is 3258." 
像这样使用字典时,可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键。在模板系统中,这种字符串格式设置方式很有用(下面的示例使用的是HTML)。
>>> template = '''<html> 
... <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)) 
<html> 
<head><title>My Home Page</title></head> 
<body> 
<h1>My Home Page</h1> 
<p>Welcome to my home page!</p> 
</body> 

猜你喜欢

转载自blog.csdn.net/jamfiy/article/details/87928183