Python复习笔记之“字典”
Python复习笔记之“字典”
程序媛syuu 发表于1年前
Python复习笔记之“字典”
  • 发表于 1年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

                我们已经了解到,列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。在本章中,你将学到一种通过名字来引用值的数据结构。这种类型的数据结构称为映射(mapping)。字典是Pyhton中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存在在一个特定的键(key)下。键可以是数字,字符串甚至是元组。

1.1字典的使用

                不管是现实中的字典还是Python中的字典,都是为了可以通过轻松查找某个特定的词语(键),从而找到它的定义(值)。

                某些情况下,字典比列表更加适用:

  • 表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组。
  • 存储文件修改时间,用文件名作为键。 
  • 数字电话/地址薄。 *电话号码(以及其他可能以0开头的数字)应该表示为数字字符串,而不是整数

1.2创建和使用字典

                字典可以通过下面的方式创建。

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

                字典由多个键以及其对应的值构成的键-值对组成(我们也把键-值对称为项)。在上例中名字是键,电话号码是值。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。空字典(不包括任何项)由两个大括号组成,像这样:{}。

                *字典中的键是唯一的(其他类型的映射也是如此),而值并不唯一。

1.2.1dict函数

                可以用dict函数,通过其他映射(比如其他字典)或者(键,值)对的序列建立字典

                *dict函数根本不是真正的函数。它是个类型,就像list,tuple和str一样。

>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> items=[('name','Gumby'),('age',42)]
>>> d=dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}

                dict函数也可以通过关键字参数来创建字典 。

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

                还能以映射作为dict函数的参数,以建立其项与映射相同的字典(如果不带任何参数,则dict函数返回一个新的空字典,就像list,tuple以及str等函数一样)。

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

 1.2.2基本字典操作  

             字典的基本行为在很多方面与序列(sequence)类似:

  • len(d)返回d中项(键-值对)的数量;
  • d[k]返回关联到键k上的值;
  • d[k]=v将值v关联到键k上;(可用于更改值,也可用于添加项)
  • del d[k]删除键为k的项;
  • k in d检查d中是否含有键为k的项。

                尽管字典和列表有很多特性相同,但是也有下面一些重要的区别。

  • 键类型 :字典的键不一定为整形数据(但也可以是),键可以是任意的不可变类型,比如浮点型(实型),字符串或者元组。*不包括list,因为list可变
  • 自动添加: 即使键起初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索                  引上。
>>> x=[]
>>> x[42]='Foobar'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> x={}
>>> x[42]='Foobar'
>>> x
{42: 'Foobar'}
  • 成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。

                *Tips: 在字典中检查键的成员资格比在列表中检查值的成员资格更高效,数据结构的规模越大,两者的效率差距越明显。

                下面所示是电话本例子的代码:

#一个简单的数据库
#字典人名作为键。每个人用另一个字典来表示,其键'phone'和'addr'分别表示他们的电话号码和地址。'和‘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's %s is %s." % (name,labels[key],people[name][key]))

1.2.3字典的格式化字符串

                在每个转换说明符中的%字符后面,可以加上键(用圆括号括起来),后面再跟上其他说明元素。

>>> phonebook
{'Cecil': '3258', 'Beth': '9102', 'Alice': '2341'}
>>> "Ceil's phone number is %(Cecil)s." %phonebook
"Ceil's phone number is 3258."

                当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以使用任意数量的转换说明符。这类字符串格式化在模板系统中非常有用。

1.2.4字典方法

                就像其他内建类型一样,字典也有方法。

        1.clear

                clear方法清除字典中所有的项。这是个原地操作(list.sort),所以无返回值(或者说返回None)。

>>> d={}
>>> d['name']='Gumby'
>>> d['age']=42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value=d.clear()
>>> d
{}
>>> print(returned_value)
None

                为什么这个方法有用呢?考虑一下两种情况。下面是第一种:

>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x
{'key': 'value'}
>>> x={}
>>> y
{'key': 'value'}

                然后是第二种情况:

>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}

                两种情况中,x和y最初对应同一个字典。情况1中,通过将x关联到一个新的空字典“清空”它,这对y一点影响也没有,它还关联到原先的字典。这可能是所需要的行为。但是如果真的想清空原始字典中的所有元素,必须使用clear方法。正如情况2中所看到的,y随后也被清空了。

        2.copy

                copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallow copy),因为值本身就是相同的,而不是副本)

>>> x={'username':'admin','machines':['foo','bar','baz']}
>>> y=x.copy()
>>> y
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y['username']='mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}

                 可以看到,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值(原地修改而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中(就像上面例子中的machines列表一样)。

                避免这个问题的一种方法就是使用深复制(deep copy),复制其包含的所有值。可以使用copy模块中的deepcopy函数来完成操作。

>>> from copy import deepcopy
>>> d={}
>>> d['name']=['Alfred','Bertrand']
>>> d
{'name': ['Alfred', 'Bertrand']}
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['name'].append('Clive')  #append为在列表末尾追加新的对象
>>> c
{'name': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'name': ['Alfred', 'Bertrand']}

        3.fromkeys

                fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。

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

                刚才的例子中首先构造了一个空字典,然后调用它的fromkeys方法,建立另外一个字典——有些多余。

                此外,您还可以直接在dict上面调用该方法,dict是所有字典的类型。

                如果不想使用None作为默认值,也可以自己提供默认值。

>>> dict.fromkeys(['name','age'])
{'age': None, 'name': None}
>>> dict.fromkeys(['name','age'],'(unknown)')  #自己提供默认值unknown
{'age': '(unknown)', 'name': '(unknown)'}

        4.get

                get方法是个更宽松的访问字典的方法。

                一般来说,如果试图访问字典中不存在的项时会出错:

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

                而get就不会:

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

                可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自己定义“默认”值,替换None。

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

                如果键存在,get用起来就像普通的字典查询一样:

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

        5.has_key

                has_key可以检查字典中是否含有特定的键。表达式d.has_key(k) 相当于表达式k in d。使用哪个方式很大程度上取决于自己的爱好。Python3.0中不包含这个函数。

        6.items和iteriterms

                items方法将字典所有的项以列表的方式返回,列表中的每一项都表示为(键,值)对的形式。但是项在返回时并没有遵循特定的次序。

 

 

           

共有 人打赏支持
粉丝 5
博文 7
码字总数 8440
×
程序媛syuu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: