python学习笔记4

字典(python唯一内建的映射类型)

1.创建和使用字典
>>> phonebook = {'liu':'0234','feng':'043254'}
>>> phonebook
{'liu': '0234', 'feng': '043254'}

键值唯一,值可重复

dict函数(不是真正的函数,是个类型,像list、tuple、str)
映射
>>> items = [('name','test'),('age',10)]
>>> items
[('name', 'test'), ('age', 10)]
>>> d = dict(items)
>>> d
{'age': 10, 'name': 'test'}
关键字
>>> d = dict(name='test',age=20)
>>> d
{'age': 20, 'name': 'test'}

基本字典操作
len(d) 返回d中项数量
d[k] 返回关联到键k上的值
d[k]=v 将值v关联到键k上
del d[k] 删除键为k的项
k in d 检查d中是否有含有键为k的项

字典和列表的区别
键类型:字典的键不一定为整型数据,浮点型、字符串或者元组
自动添加:即时键起初在字典中并不存在,也可分配一个值
成员资格:k in d(字典),查找的是键不是值 v in l(列表),查找值而不是索引

示例

[python]
people = {

    'alice':{
        'phone':'06543',
        'addr':'hefei'
    },
    'benly':{
        'phone':'0123',
        'addr':'sc'
    },    

}

labels = {
    'phone':'phone number',
    'addr':'address'
}

name = raw_input('Name:')

request = raw_input('phone numbel (p) or address (a)?')

if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

if name in people:
    print "%s %s is %s." % (name, labels[key], people[name][key])
else:
    print "no have this people."        

[/python]
字典的格式化字符串
>>> phonebook = {'liu':'0234','feng':'043254'}
>>> "liu's phone number is %(liu)s." % phonebook
"liu's phone number is 0234."

字典方法
clear方法清除字典中所有的项,这个是原地操作(类似于list.sort),所以无返回值(或者说返回None)
>>> phonebook
{'liu': '0234', 'feng': '043254'}
>>> returned = phonebook.clear()
>>> phonebook
{}
>>> print returned
None

为什么用这个方法,考虑两种情况
第一种
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x = {}
>>> y
{'key': 'value'}

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

想清空原始字典中所有的元素,必须使用clear方法

copy
浅复制
>>> x = {'username':'admin', 'like':['read','music','code']}
>>> y = x.copy()
>>> y['username'] = 'test'
>>> y['like'].remove('read')
>>> y
{'username': 'test', 'like': ['music', 'code']}
>>> x
{'username': 'admin', 'like': ['music', 'code']}

可以看出副本中替换值的时候,原始字典不受影响,如果修改了某个值,原始字典也会变动
为了避免这个问题,使用深复制

深复制
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['test1','test2']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('test3')
>>> c
{'names': ['test1', 'test2', 'test3']}
>>> dc
{'names': ['test1', 'test2']}

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'}

get
一般来说,试图访问字典中不存在的项时会出错,get不会
>>> d = {}
>>> print d['ddd']

Traceback (most recent call last):
File " <pyshell#99>", line 1, in 
print d['ddd']
KeyError: 'ddd'
>>> print d.get('name')
None

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

示例

[python]
people = {

    'alice':{
        'phone':'06543',
        'addr':'hefei'
    },
    'benly':{
        'phone':'0123',
        'addr':'sc'
    },    

}

labels = {
    'phone':'phone number',
    'addr':'address'
}

name = raw_input('Name:')

request = raw_input('phone numbel (p) or address (a)?')

key = request

if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

person = people.get(name,{})
label = labels.get(key,key)
result = person.get(key,'not valid')

print "%s %s is %s." % (name, label, result)
[/python]
has_key(python3.0中不包括这个函数)
想当于k in d
>>> d = {}
>>> d.has_key('name')
False
>>> d
{}
>>> d['name'] = 'eric'
>>> d.has_key('name')
True
>>> 'name' in d
True

items和iteritems
items方法将所有的字典项以列表方式返回
>>> d = {'title':'python web site','url':'www.python.org'}
>>> d
{'url': 'www.python.org', 'title': 'python web site'}
>>> d.items()
[('url', 'www.python.org'), ('title', 'python web site')]

iteritems作用大致相同,但是会返回一个迭代器对象而不是列表(很多情况下使用iteritems更高效)
>>> d.iteritems()

>>> it = d.iteritems()
>>> it

>>> list(it)
[('url', 'www.python.org'), ('title', 'python web site')]

keys和iterkeys
keys方法将字典中的键以列表形式返回,iterkeys返回针对键的迭代器
>>> d
{'url': 'www.python.org', 'title': 'python web site'}
>>> d.keys()
['url', 'title']

>>> d
{'url': 'www.python.org', 'title': 'python web site'}
>>> it = d.iterkeys()
>>> list(it)
['url', 'title']

pop
获得对应给定键的值,然后将这个键-值从字典中移除
>>> d = {'x':1, 'y':2}
>>> d
{'y': 2, 'x': 1}
>>> d.pop('x')
1
>>> d
{'y': 2}

popitem
类似于list.pop,后者会弹出列表的最后一个元素,而popitem弹出随机的项
>>> d
{'y': 2, 'x': 1}
>>> d.popitem()
('y', 2)
>>> d
{'x': 1}

popitem和列表的pop方法很类似,但字典中没有和append等价的方法,因为字典是无序的

setdefault
某种程度上类似于get方法,还能在字典中不含有给定键的情况下设定相应的键值
>>> d
{'y': 2, 'x': 1}
>>> d.setdefault('x')
1
>>> d.setdefault('z','123')
'123'
>>> d
{'y': 2, 'x': 1, 'z': '123'}
>>> d.setdefault('i')
>>> d
{'y': 2, 'x': 1, 'z': '123', 'i': None}

update
利用一个字典项更新另外一个字典
>>> d = {'x':1,'y':2}
>>> d
{'y': 2, 'x': 1}
>>> u = {'x':3}
>>> d.update(u)
>>> d
{'y': 2, 'x': 3}

values和itervalues
values以列表的形式返回字典中的值,itervalues返回值的迭代器,与返回键的列表不同的是,返回值的列表可以包含重复的值
>>> d
{'y': 2, 'x': 3}
>>> d.values()
[2, 3]



你可能感兴趣的:(python,python学习笔记)