字典
1. 字典 :python唯一内建的映射类型
列表通过编号进行访问,列表中的值有顺序
字典通过名字进行访问,自动中的值没有顺序
字典中的键必须是不可变类型可以是数字,字符串,元组
1.1 字典的创建
#1. 直接通过赋值的方式
phonebook = {'Alice': '2341', 'Beth': '9012', 'Cecil': '3258'}
#2. 通过dict的(健,值)对的序列
items = [('name', 'Gumby'), ('age', 42)]
d = dict(items) #d = {'name': 'Gumby', 'age': 42}
#3. 通过dict的关键字参数
d = dict(name = 'Gumby', age = 42) #d = {'name': 'Gumby', 'age': 42}
#4. dict传入其他字典
d = dict(phonebook) #也可以使用字典的copy方法
#5. 新建空字典
d1 = {}
d2 = dict()
1.2 字典的基本操作
- len(d), 返回字典中项(键-值对)数量
- d[key], 返回键key对应的值
- d[key] = val, 将值val关联到键key
- del d[key], 删除键为key的项
- key in d检测字典中是否存在键为key的项
字典和列表区别
字典可以对不存在的键进行赋值,字典会建立新的项
列表不能对不存在的索引进行赋值,会引发IndexError
成员资格检测,k in d查找的是键,k in l查找的是值,字典中in操作比列表高效,数据规模越大越明显
1.3 字典格式字符串
- 转换说明符(%)后面加上键,使用括号括起来
d = {'name': 'Grumby', 'phone': '9012'}
"%(name)s's phone number is %(phone)s" % d
1.4 字典方法
-
clear()方法, 清楚字典中的所有项,原地操作,返回None
d = dict(name = 'Gumby', age = '42') return_val = d.clear() print return_val #return_val = None print d #d = {}
-
copy()方法,返回一个具有相同键-值对的新字典(这个方法实现的是浅拷贝shallow copy)
#1. 浅拷贝shallow copy x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} y = x.copy() y['username'] = 'mlh' y['machines'].remove('bar') print x #{'username': 'admin', 'machines': ['foo', 'baz']} print y #{'username': 'mlh', 'machines': ['foo', 'baz']} #2. 深拷贝 from copy import deepcopy d = {} d['name'] = ['Alfred', 'Bertand'] c = d.copy() dc = deepcopy(d) d['name'].append('Clive') print d #{'name': ['Alfred', 'Bertand', 'Clive']} print c #{'name': ['Alfred', 'Bertand', 'Clive']} print dc #{'name': ['Alfred', 'Bertand']}
-
fromkeys(lst)方法,使用给的的键建立新的字典,每个键对应的值为None
# 1. 通过自动调用 {}.fromkeys(['name', 'age']) #{'age': None, 'age': None} # 2. 直接使用dict调用 dict.fromkeys(['name', 'age']) #{'age': None, 'age': None} # 3. 指定默认值 dict.fromkeys(['name', 'age'], 'unknown') #{'age': 'unknown', 'name': 'unknown'}
-
get(k[, default])方法,更宽松访问字典方法,使用[]访问字典中不存在的方法是会引发KeyError,get方法不会,会返回一个默认值None
#1. 基本用法 d = {} d['name'] #KeyError d.get('name') #没有异常,返回None #2. get还可以自定义默认值 d.get('name', 'unknown') # unknown
-
has_key(key)方法,检查字典中是否含有特定的键,d.has_key(k)相当与k in d,python3.0中没有这个函数
>>> d = {} >>> d.has_key('name') False >>> d['name'] = 'Eric' >>> d.has_key('name') True
-
items()和iteritems(),返回字典所有的项,iterms以列表方式返回,iteriterms返回一个迭代器,很多情况下iteritems跟高效,
>>> d = {'titile': 'Python Web Site', 'url': 'http://www.python.org', 'spam': '0'} >>> d.items() [('url', 'http://www.python.org'), ('spam', '0'), ('titile', 'Python Web Site')] >>> d.iteritems() <dictionary-itemiterator object at 0x030AC2D0> >>> list(d.iteritems()) [('url', 'http://www.python.org'), ('spam', '0'), ('titile', 'Python Web Site')] >>>
-
keys()和iterkeys(),返回自动所有key,和上面两个方法类似
>>> d.keys() ['url', 'spam', 'titile'] >>> d.iterkeys() <dictionary-keyiterator object at 0x030AC2D0> >>> list(d.iterkeys()) ['url', 'spam', 'titile']
-
pop(key)方法,获取给的键的值,并移除该项,,key不存在引发KeyError
>>> d.pop('spam') '0' >>> d {'url': 'http://www.python.org', 'titile': 'Python Web Site'} >>> d.pop('spam') KeyError: 'spam'
-
popitem()方法,类似于list.pop,与list不同的是字典弹出任意一个项,因为字典没有顺序
>>> d.popitem() ('url', 'http://www.python.org')
-
setdefault(key[, value = None])方法,某种程度上与get类似,能够获取与给定键关联的值,初次外setdefault还能在字典不含有给定键的情况下设定相应的键值。
>>> d = {} >>> print d.setdefault('name', 'Gumby') Gumby >>> d {'name': 'Gumby'} >>> print d.setdefault('name', 'Beth') Gumby >>> d {'name': 'Gumby'}
setdefault(key, value = None)在key不存在时先向字典添加项,返回键的值,在字典中key已存在时,直接返回key的值
-
update(),利用另一个字典更新字典,新的key添加,相同的key覆盖,参数与dict()方法类似,可以是字典,(key, val)对的序列或可迭代对象及关键字参数。
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org'} >>> x = {'title': 'Python Language Website', 'changed': '2008-10-28 22:09:15'} >>> d.update(x) >>> d {'url': 'http://www.python.org', 'changed': '2008-10-28 22:09:15', 'title': 'Python Language Website'}
-
values()和itervalues(),以列表方式返回字典中的值(itervalues返回迭代器),与keys()不同的返回值可以包含重复的元素
>>> d = {'url': 'http://www.python.org', 'changed': '2008-10-28 22:09:15', 'title': 'Python Language Website'} >>> d.values() ['http://www.python.org', '2008-10-28 22:09:15', 'Python Language Website'] >>> d.itervalues() <dictionary-valueiterator object at 0x031E8F30>