Python基础篇-字典

2016-11-25 · 🙈Lei · 0条 · 619次

容器:序列,字典,集合。

字典是Python中唯一内建的映射(mapping)类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键下,键可以是数字、字符串甚至是元组。

字典中的键是唯一的,而值并不唯一。

>_ dict

像list, tuple, str一样,dict也是一种类型。可以利用它,通过其他映射(比如其他字典)或者键值对的序列建立字典。

>>> who = [('name', 'George'), ('age', 40)] 
>>> who [('name', 'George'), ('age', 40)] 
>>> whoDict = dict(who) 
>>> whoDict {'age': 40, 'name': 'George'} 
>>> whoDict['name'] 'George'

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

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

如果将一个字典使用dict创建一个相同的字典,那么可以使用copy方法可以达到相同的效果。

>_ 基本字典操作

1.返回项的数量:len(d)

2.d[k]返回关联到键k上的值

3.d[k] = m将值m关联到键k上

4.del d[k]删除键为k的元素

5.k in d 检查d中是否有键为k的元素

>_ 字典与列表的不同

键类型:字典的键不一定为整数类型,键可以是任意的不可变类型,比如浮点型(实型)、字符串或者元组。

自动添加:即使键起初在字典中并不存在,也可以为其赋值,这样字典会建立一个新的项。而列表除了使用append或者执行类似操作,不能将值关联到列表范围之外的索引上。

成员资格:字典的成员资格检查是查找的键,而列表的成员资格检查是查找的值。

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

>_字典方法

1.clear()

该方法清除字典中所有的项,无返回值(None)。

>>> x = {} 
>>> x[1] = '1' 
>>> x[2] = '2' 
>>> x {1: '1', 2: '2'} 
>>> y = x 
>>> y {1: '1', 2: '2'} 
>>> x = {} 
>>> x {} 
>>> y {1: '1', 2: '2'} 
>>> x[1] = '1' 
>>> x[2] = '2' 
>>> x {1: '1', 2: '2'} 
>>> y = x 
>>> x.clear() 
>>> x {} 
>>> y {}

2.copy()和deepcopy()

copy()方法返回一个具有相同键-值对的新字典(浅复制)。当在副本中替换值的时候,原始字典不受影响。如果修改某个值(原地修改,而不是替换),原始的字典也会改变。因为同样的值也存储在原字典中。

>>> a = {'first': 'ray', 'second':'nie', 'third': ['1', '2', '3']} 
>>> a {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'nie'} 
>>> b = a.copy() 
>>> b {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'nie'} 
>>> b['second'] = 'n' 
>>> b {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'n'} 
>>> a {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'nie'} 
>>> b = a.copy() 
>>> b {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'nie'} 
>>> a['second'] = 'n' 
>>> a {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'n'} 
>>> b {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'nie'} 
>>> b = a.copy() 
>>> b {'first': 'ray', 'third': ['1', '2', '3'], 'second': 'n'} 
>>> b['third'].remove('2') 
>>> b {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 
>>> a {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 

deepcopy()复制其所包含的所有值(深复制)。该函数是copy模块的一个函数。

>>> a {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 
>>> b = a.copy() 
>>> from copy import deepcopy 
>>> c = deepcopy(a) 
>>> b {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 
>>> c {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 
>>> b['third'].remove('1') 
>>> b {'first': 'ray', 'third': ['3'], 'second': 'n'} 
>>> a {'first': 'ray', 'third': ['3'], 'second': 'n'} 
>>> c {'first': 'ray', 'third': ['1', '3'], 'second': 'n'} 
>>> c['third'].append('2') 
>>> c {'first': 'ray', 'third': ['1', '3', '2'], 'second': 'n'} 
>>> a {'first': 'ray', 'third': ['3'], 'second': 'n'} 
>>> b {'first': 'ray', 'third': ['3'], 'second': 'n'} 

3.fromkeys()

该方法利用给定的键建立新的字典 。

>>> {}.fromkeys(['a', 'b']) {'b': None, 'a': None} 
>>> dict.fromkeys(['a','b']) {'b': None, 'a': None} 
>>> dict.fromkeys(['a', 'b'], ['1', '2']) {'b': ['1', '2'], 'a': ['1', '2']} 

4.get()

该方法是一种更宽松的访问字典的方法,使用该方法访问字典中不存在的键值时,不会报错,而是返回None。

>>> a {'first': 'ray', 'third': ['3'], 'second': 'n'} 
>>> a[1] Traceback (most recent call last): File "<pyshell#60>", line 1, in <module> a[1] KeyError: 1 
>>> a.get(1) >>> print(a.get(1)) None 

可以自定义‘None’值。

>>> a {'first': 'ray', 'third': ['3'], 'second': 'n'} 
>>> a[1] Traceback (most recent call last): File "<pyshell#60>", line 1, in <module> a[1] KeyError: 1 
>>> a.get(1) 
>>> print(a.get(1)) None 
>>> 

5.has_key()

该方法可以检查字典中是否含有特定的键。Python3.0中没有这个方法。d.has_key(k)相当于k in d。

6.items()和iteritems()

items()将字典所有的项以列表方式返回,列表中的每一项都是键值对的形式,项在返回时并没有遵循特定的次序。iteritems()方法返回一个迭代器对象,在Python3中已经取消。

>>> a = {'first': '你好', 'second':'what', 'third':['1','2']}
>>> a
{'third': ['1', '2'], 'first': '你好', 'second': 'what'}
>>> a.items()
dict_items([('third', ['1', '2']), ('first', '你好'), ('second', 'what')])
>>> it = a.iteritems()
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
it = a.iteritems()
AttributeError: 'dict' object has no attribute 'iteritems'

7.keys()和 iterkeys()

keys()方法将字典中的键以列表方式返回,iterkeys()方法将键返回为迭代器对象。Python3中已经取消了iterkeys()。

>>> a.keys()
dict_keys(['third', 'first', 'second'])
>>> a.iterkeys()
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
a.iterkeys()
AttributeError: 'dict' object has no attribute 'iterkeys'

8.pop()

该方法用来获取对应于给定键的值,然后将这个键-值对从字典中移除。

>>> a
{'third': ['1', '2'], 'first': '你好', 'second': 'what'}
>>> a.pop('first')
'你好'
>>> a
{'third': ['1', '2'], 'second': 'what'}

9.popitem()

popitem()弹出字典中随机的项。如果想一个接一个地移除并处理项,这个方法非常有效,因为不必首先获取键的值。

>>> a
{'third': ['1', '2'], 'second': 'what'}

>>> a.popitem()
('third', ['1', '2'])
>>> a
{'second': 'what'}

10.setdefault()

setdefault()可以获得与给定键相关联的值,该方法还能在字典中不含有给定键的情况下设定相应的键值。

>>> a
{'second': 'what'}
>>> a.setdefault('second')
'what'
>>> a
{'second': 'what'}
>>> a.setdefault('first', 'ni')
'ni'
>>> a
{'first': 'ni', 'second': 'what'}

默认值是可选的,如果不设定,会默认使用None。

11.update()

该方法可以利用一个字典项更新另一个字典。

>>> b = {'first': '你好'}
>>> a
{'first': 'ni', 'second': 'what'}
>>> b
{'first': '你好'}
>>> a.update(b)
>>> a
{'first': '你好', 'second': 'what'}

提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。

12.values()和itervalues()

values()方法以列表的形式返回字典中的值,itervalues()方法返回值的迭代器。返回值的列表中可以包含重复的元素。itervalues()方法在Python3中已取消。

>>> a
{'first': '你好', 'second': 'what'}
>>> a.values()
dict_values(['你好', 'what'])
>>> a.itervalues()
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
a.itervalues()
AttributeError: 'dict' object has no attribute 'itervalues'


  0