ch4 字典

来源:互联网 发布:mac滴管粉底液 编辑:程序博客网 时间:2024/05/21 09:32

4.1 字典的使用

  • 一种通过名字引用值的数据结构,这种结构类型称为映射,字典中的值没有特殊的顺序,但是都存储在一个特定的键里,键可以是数字、字符串甚至是元组。

4.2 创建和使用字典

  • 字典可以通过下面的方式创建:
>>>phonebook = {'Alice' : '2341' , 'Beth' : '9102' , 'Cecil' : '3258'}
  • 字典由多个键及与其对应的值构成的对组成,每个键和它的值之间用冒号隔开,项之间用逗号隔开,整个字典用一对大括号括起来。
    字典中的键是唯一的,而值并不唯一。

4.2.1 dict函数

  • 可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。
>>>items = [('name' , 'Gumby'),('age' , 42)]>>>d = dict(items)>>>d{'age': 42, 'name': 'Gumby'}>>>d['name']'Gumby'
  • dict函数也可以通过关键字参数来创建字典
>>>d = dict(name='Gumby' , age=42)>>>d{'age': 42, 'name': 'Gumby'}

4.2.2 基本字典操作

  • 字典的基本行为在很多方面与序列类似
    1. len(d)返回d中项的数目
    2. d[k]返回关联到键k上的值
    3. d[k]=v将值v关联到键k上
    4. del d[k]删除键为k的项
    5. k in d检查d中是否有含有键为k的项
  • 字典和列表有很多特性相同,但也有一些区别
    1. 键类型:字典的键不一定为整型数据,也有可能是其他不可变类型,比如浮点型,字符串或者元组
    2. 自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。
    3. 成员资格:查找的是键,而不是值。

4.2.3 字典的格式化字符串

  • 可以用字典格式化字符串,在每个转换说明符中的%后面,可以加上键,后面再跟上其他说明元素。
>>>phonebook{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}>>>"Cecil's phone number is%(Cecil)s."% phonebook"Cecil's phone number is 3258."

4.2.4 字典方法

1. clear方法:clear方法清除字典中的所有项,这是个原地操作,所以没有返回值。
2. copy方法:返回一个具有相同键-值对的新字典(实现浅复制,因为值本身就是相同的,而不是副本)
>>>x = {'username': 'admin', 'machines': ['foo','bar','baz']}>>>y = x.copy()>>>y['username'] = 'mlh'>>>y['machines'].remove('bar')>>>y{'username': 'mlh', 'machines': ['foo', 'baz']}>>>x{'username': 'admin', 'machines': ['foo', 'baz']}
  • 可以看出,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值,原始的字典也会改变,因为同样的值也存储在原字典中。可以用深复制避免这个问题,复制其包含的所有值。
>>>from copy import deepcopy>>>d = {}>>>d['names'] = ['Alfred', 'Bertrand']>>>c = d.copy()>>>dc = deepcopy(d)>>>d['names'].append('Clive')>>>c{'names': ['Alfred', 'Bertrand', 'Clive']}>>>dc{'names': ['Alfred', 'Bertrand']}
3.fromkeys方法

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

>>>{}.fromkeys(['name', 'age']){'age': None, 'name': None}
>>>dict.fromkeys(['name', 'age']){'age': None, 'name': None}
  • 也可以自己提供默认值
>>>dict.fromkeys(['name', 'age'], '(unknown)'){'age': '(unknown)', 'name': '(unknown)'}
4. get方法
  • get方法是个更宽松访问字典项的方法。一般来说,如果试图访问字典中不存在的项是会出错,而用get就不会
>>>d = {}>>>print d['name']Traceback (most recent call last):  File "G:\python\test.py", line 2, in <module>    print d['name']KeyError: 'name'>>>print d.get('name')None
  • 也可以自定义默认值,替换None
>>>d.get('name', 'N/A')'N/A'
5. has_key
  • has_key可以检查字典中是否含有给出的键。表达式d.has_key(k)相当于表达式k in d。Python3.0不包含这个函数。
>>>d = {}>>>d.has_key('name')False>>>d['name'] = 'Eric'>>>d.has_key('name')True
6. items和iteritems
  • items方法把所有的字典项以列表方式返回,这些列表项中的每一项来自于(键,值),但是项在返回时没有特殊的顺序。
>>>d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}>>>d.items()[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
  • iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表:
>>>it = d.iteritems()>>>it<dictionary-itemiterator object at 0x0163FB70>>>>list(it) #convert the iterator to a list[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
7. keys和iterkeys
  • keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器。
8. pop
  • pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除
>>>d = {'x':1, 'y': 2}>>>d.pop('x')1>>>d{'y': 2}
9. popitem
  • popitem类似于list.pop,后者会弹出列表中的最后一个元素,但是popitem会弹出随机的项,因为字典没有最后的元素相关的顺序概念。
10. setdefault
  • setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此以外,setdefault还能在字典不含有给定键的情况下设定相应的键值。
>>>d = {}>>>d.setdefault('name', 'N/A')'N/A'>>>d{'name': 'N/A'}>>>d['name'] = 'Gumby'>>>d.setdefault('name','N/A')'Gumby'>>>d>>>{'name': 'Gumby'}
11. update
  • update方法可以利用一个字典项更新另外一个字典,提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
12. values和itervalues
  • values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。
>>>d = {}>>>d[1] = 1>>>d[2] = 2>>>d[3] = 3>>>d[4] = 1>>>d.values()[1,2,3,1]

4.3 小结

  • 映射
  • 利用字典格式化字符串
  • 字典的方法
0 0
原创粉丝点击