python学习六--字典

来源:互联网 发布:java开发环境是什么 编辑:程序博客网 时间:2024/05/20 07:18
字典
字典的使用
现实中的字段及在python中的字段都进行了构建,从而可以轻松查到某个特定的词语(键),从而找到它的意义(值)。
某些情况下,字典比列表更加适用:
#表征游戏棋盘的状态,每个键都是由坐标值组成的元组;
#存储文件修改次数,用文件名作为键; 
#数字电话/地址本

创建一个人名列表,以及四位的分机号码:
>>> names = ['laolang','wolf','yujing','nanna']  
>>> numbers = ['2313','9102','3158','4326']       
>>> numbers[names.index('laolang')]              
'2313'
=========================================
创建和使用字典
字典可以通过下面方式创建
>>> phonebook = {'laolang':'2313','wolf':'9102','yujing':'3158'}
>>> dict1 = { 'abc': 456 };
>>> dict2 = { 'abc': 123, 98.6: 37 };
注意:
每个键与值用冒号隔开(:),每对用逗号,每对用逗号分割,整体放在花括号中({})。
键必须独一无二,但值则不必。
值可以取任何数据类型,但必须是不可变的,如字符串,数或元组

dict函数
可以用dict 函数,通过其他映射(比如其他字典)或(键,值)这样的序列对建立字典。
>>> items = [('name','gumby'),('age',42)]
>>> d = dict(items)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict' object is not callable
dict()是python的一个函数,但我又将dict自定义为一个python字典,在之后想调用dict()
函数是会报出“TypeError: 'dict' object is not callable”的错误,只需将之前自定义的变量delete掉即可。
>>> del (dict)
>>> d = dict(items)                      
>>> d
{'age': 42, 'name': 'gumby'}
>>> 
>>> d['name']
'gumby'
dict函数也可以通过关键字参数来创建字典,如下例所示:
>>> d = dict(name ='gumby', age=42)
>>> d
{'age': 42, 'name': 'gumby'}
===========================================
字典的基本操作
删除字典元素
能删单一的元素也能清空字典,清空只需一项操作。
显示删除一个字典用del命令,如下实例:
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>> print dict 
{'Age': 7, 'Name': 'Zara', 'Class': 'First'}
>>> del dict['Name']
>>> print dict      
{'Age': 7, 'Class': 'First'}
>>> dict.clear();
>>> print dict   
{}
>>> del dict
>>> print dict
<type 'dict'>

del dict['Name']; # 删除键是'Name'的条目
dict.clear();     # 清空词典所有条目
del dict ;        # 删除词典

实例
#!/usr/bin/python
people ={
    'wolf':{
        'phone':'2341',
        'addr':'foo drive 23'
    },
    'laolang':{
        'phone':'9102',
        'addr':'bar street 42'
        },
   'nannan':{
        'phone':'3158',
        'addr':'baz avenue 90'
        }
    }
labels = {
    'phone':'phone number',
    'addr':'address'
    }
name = raw_input('Name:')
request = raw_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])

[root@node01 python]# chmod +x zd.py 
[root@node01 python]# python zd.py 
Name:wolf
phone number(p) or address (a)?p
wolf's phone number is 2341.
[root@node01 python]# python zd.py 
Name:laolang
phone number(p) or address (a)?a
laolang's address is bar street 42.
[root@node01 python]# python zd.py 
Name:nannan
phone number(p) or address (a)?a
nannan's address is baz avenue 90.

字典格式化字符串
>>> phonebook = {'laolang':'2313','wolf':'9102','yujing':'3158'} 
>>> "yujing's phone number is %(yujing)s." % phonebook
"yujing's phone number is 3158."

还有一种转换模版string.Template
==========================================
字典方法
1、clear
>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] =42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}

>>> dict_li = {'users':'swht','age':'18',}
>>> dict_li
{'age': '18', 'users': 'swht'}
>>> dict_li.clear()
>>> dict_li
{}

2、copy
功能:浅复制
>>> dict_li = {'users':'swht','age':'18',}
>>> dict_li.copy()
{'age': '18', 'users': 'swht'}
>>> dict_li = {'users':'swht','age':'18','address':{'sd':'dz'}}
>>> dict_li.copy()
{'age': '18', 'users': 'swht', 'address': {'sd': 'dz'}}

>>> x = {'username': 'admin', 'machines': ['foo','bar','baz']} 
>>> y = x.copy()
>>> y['username'] = 'wolf'
>>> y['machines'].remove('bar')
>>> y
{'username': 'wolf', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
可以看到,当在副本中替换的时候,原始字典不受影响,但是,如果修改了一个值(原地修改,
而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中。
避免这个问题就要使用深复制(deep copy),复制其包含的所有值。
>>> 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()
功能:用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
dict.fromkeys(seq[, value]))
参数:seq -- 字典键值列表。
      value -- 可选参数, 设置键序列(seq)的值。
>>> li = ['users','age']
>>> dict_li = dict.fromkeys(li,'swht')
>>> dict_li
{'age': 'swht', 'users': 'swht'}

>>> dict.fromkeys(['name','age']) 
{'age': None, 'name': None}            每一个键对应一个默认的值none
>>> dict.fromkeys(['name','age'],'(unknow)')  
{'age': '(unknow)', 'name': '(unknow)'}   如果不想用none作为默认值,也可以自己提供默认值。

4、get
功能:获取字典的value值
>>> dict_li = {'users':'swht','age':'18',}
>>> dict_li.get('users')
'swht'

一般来说,如果试图访问字典中不存在的项时会出错。
>>> d = {}
>>> print d['name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'
而使用get就不会报错
>>> print d.get('name')
None

>>> d.get('name','N/A')   这里也可以自定义默认值
'N/A'

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

实例:
#!/usr/bin/python
people ={
    'wolf':{
        'phone':'2341',
        'addr':'foo drive 23'
    },
    'laolang':{
        'phone':'9102',
        'addr':'bar street 42'
        },
   'nannan':{
        'phone':'3158',
        'addr':'baz avenue 90'
        }
    }
labels = {
    'phone':'phone number',
    'addr':'address'
    }
name = raw_input('Name:')
request = raw_input('phone number(p) or address (a)?')
if request == 'p':key = 'phone'
if request == 'a':key = 'addr'

person = people.get(name, {})
label = labels.get(key, key)
result = person.get(key, 'not available')
print "%s's %s is %s." % (name, label, result)

[root@node01 python]# python get.py 
Name:wolf
phone number(p) or address (a)?a
wolf's address is foo drive 23.
[root@node01 python]#

5、has_key
功能:检查字典中是否含有特定的键。
>>> d['name'] = 'wolf'
>>> d.get('name')      
'wolf'
>>> d = {}
>>> d.has_key('name')
False
>>> d['name'] = 'wolf'
>>> d.has_key('name') 
True

6、items和iteritems
功能:返回可遍历的(键, 值) ,以列表的形式返回。
>>> 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')]
>>> it  = d.iteritems()
>>> it
<dictionary-itemiterator object at 0x7fd750d21e10>
>>> list(it)
[('Url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web Site')]

7、key和iterkeys
key方法将字典中的键以列表形式返回。
>>> dict = {'Name': 'Zara', 'Age': 7}
>>> print "Value : %s" %  dict.keys()
Value : ['Age', 'Name']

8、pop
pop方法用来获得对应于给定键的值,然后将这个键-值对从字典里移除。
>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}

9、popitem
popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitem弹出
随机项,因为字典并没有“最后的元素”或者其他相关顺序的概念。若想一个一个地移除并处
理项,这个方法就非常有效了。
>>> d = {'title': 'Python web Site', 'Url': 'http://www.python.org', 'spam': 0}
>>> d.popitem()
('Url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python web Site'}
>>> d.popitem()
('spam', 0)
>>> d
{'title': 'Python web Site'}

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

>>> d = {}
>>> print d.setdefault('name')   如果键值不存在就返回默认值并且相应地更新字典。
None
>>> d
{'name': None}

11、update
update方法可以利用一个字典项更新另一个字典。
>>> d = {
... 'title': 'Python Web Site',                             
... 'urlt': 'http://www.python.org',
... 'changed': 'Mar 14 22:09:15 MET 2008'
... }
>>> x = {'title': 'Python Language Website'}             
>>> d.update(x)
>>> d
{'urlt': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2008', 'title': 'Python Language Website'}

12、values和itervalues
values方法以及列表的形式返回字典中的值。
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
[1, 2, 3, 1]
>>> d



原创粉丝点击