Python 字典 (4) 持续更新

字典一种用名字来引用值的数据结构,这种数据结构称为 映射(mapping) 。字典中的键可以是数字、字符串和元组。

字典 创建和使用

创建

phonebook = {'Aaron':13300000000,'Beth':13311111111,'Alice':13322222222}

键和值用 : 隔开

项之间的用 , 隔开

整个字典 大括号扩起来 { }  

Dict函数 创建 和 访问

>>> phonebook = dict(Aaron=13300000000,Beth=13311111111)
>>> phonebook['Aaron']
13300000000L

字典操作

字典大部分函数和序列类似:

  • len(dict) 返回dict中 项 数量
  • d[k]    返回 字典 K 键 值
  • d[k] = v  修改值
  • del d[k]   删除项
  • k in d   检查是否包含 k 键 项

键的类型必须是不可变的类型,如浮点型、字符串和元组。

>>> x = []
>>> x[42] = 'Foobar'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> x = [None] * 43
>>> x[42] = 'Foobar'
>>> x[42]
'Foobar'
>>> x = {}
>>> x[42] = 'Foobar'
>>> x[42]
'Foobar'

代码示例 电话本例子

people = {
    'Alice':{
        'phone':'23454',
        'addr':'Address 1'
    },
    'Aaron':{
        'phone':'888546',
        'addr':'Address 2'
    }
}
name = raw_input('Name:')

if name in people:
    info = people[name];
    print "%s's %s %s" % (name,info['phone'],info['addr']);

字典 格式化字符串

>>> phonebook = {'Aaron':456453,'Cecil':32588}
>>> 'Aaron\'s phone number is %(Aaron)s' % phonebook
"Aaron's phone number is 456453"

只要要格式化的键,能在字典里找到,就能转换。一般在html模板里,非常有用。 

同样也可以在 string.Template 使用

>>> phonebook = {'Aaron':456453,'Cecil':32588}
>>> from string import Template
>>> tempLate = Template('Aaron\'s phone number is %(Aaron)s')
>>> tempLate.substitute(phonebook)
"Aaron's phone number is %(Aaron)s"

字典方法

示例一  clear

clear 清除字典所有项

>>> phonebook = {'Aaron':456453,'Cecil':32588}
>>> phonebook
{'Aaron': 456453, 'Cecil': 32588}
>>> phonebook.clear()
>>> phonebook
{}

示例二 copy

copy 返回一个字典(浅复制)的一个新字典

浅复制示例

>>> a = {'name':'name1','info':[1,2,3,4,5]}
>>> b = a.copy()
>>> a,b
({'info': [1, 2, 3, 4, 5], 'name': 'name1'}, {'info': [1, 2, 3, 4, 5], 'name': '
name1'})
>>> b['name'] = 'name2'
>>> a,b
({'info': [1, 2, 3, 4, 5], 'name': 'name1'}, {'info': [1, 2, 3, 4, 5], 'name': '
name2'})
>>> a['info'].remove(2)
>>> a,b
({'info': [1, 3, 4, 5], 'name': 'name1'}, {'info': [1, 3, 4, 5], 'name': 'name2'
})

深复制示例

需要用到 copy模块的deepcopy函数

>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a['info'].remove(3)
>>> a,b
({'info': [1, 4, 5], 'name': 'name1'}, {'info': [1, 3, 4, 5], 'name': 'name1'})

示例三 fromkeys

fromkeys 设置字典的键,修改指定值

>>> a = {}
>>> a.fromkeys(['name','info'],'string')
{'info': 'string', 'name': 'string'}

如果不设置默认值,将是 None

>>> a.fromkeys(['name','info'])
{'info': None, 'name': None}

如果该键已经存在字典中,仍然会修改字典。

示例四 get

获得字典键对应的值,当访问不存在的键,没有任何异常,会得到None,也可以定义默认的值。

>>> a = {'name':'Aaron'}
>>> a['name']
'Aaron'
>>> a.get('name')
'Aaron'
>>> a['age']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'age'
>>> a.get('age')
>>> print a.get('age')
None
>>> print a.get('age','N/A')
N/A

使用字典的示例

people = {
    'Alice':{
        'phone':'23454',
        'addr':'Address 1'
    },
    'Aaron':{
        'phone':'888546',
        'addr':'Address 2'
    }
}

name = raw_input('Name:')
request = raw_input('Request:')

info = people.get(name)
if info:
    requestInfo = info.get(request,"No Info")
else:
    requestInfo = "No Info"
print 'name:%s %s:%s' % (name,request,requestInfo)

运行结果

C:\Users\ChengXu1\Desktop>python aa.py
Name:a
Request:a
name:a a:No Info

C:\Users\ChengXu1\Desktop>python aa.py
Name:aa
Request:s
name:aa s:No Info

C:\Users\ChengXu1\Desktop>python aa.py
Name:Aaron
Request:phone
name:Aaron phone:888546

C:\Users\ChengXu1\Desktop>python aa.py
Name:Aaron
Request:23
name:Aaron 23:No Info

get方法可以在用户输入我们未准备的情况,也能做出合理反应。

示例五 has_key

has_key 在Python3.0中已不存在,作用和 k in dict 一样,检查字典中是否含有特定的键。

示例六 items 和 iteritems

items      以列表形式返回

iteritems 返回一个迭代器对象

people = {
    'Alice':{
        'phone':'23454',
        'addr':'Address 1'
    },
    'Aaron':{
        'phone':'888546',
        'addr':'Address 2'
    }
}

print people.items()
iters = people.iteritems()
print iters
print list(iters)

运行结果

C:\Users\ChengXu1\Desktop>python aa.py
[('Aaron', {'phone': '888546', 'addr': 'Address 2'}), ('Alice', {'phone': '23454
', 'addr': 'Address 1'})]
<dictionary-itemiterator object at 0x00000000026E2C78>
[('Aaron', {'phone': '888546', 'addr': 'Address 2'}), ('Alice', {'phone': '23454
', 'addr': 'Address 1'})]

示例七 keys 和 iterkeys

keys           返回字典中的键以列表形式返回

iterkeys      返回针对键的迭代器

示例八 pop

pop            返回字典给定的键的值,并从字典中删除

>>> a = {'n':1111}
>>> a
{'n': 1111}
>>> a.pop('n')
1111
>>> a
{}

示例九 popitem

popitem方法 弹出一个随机项,并从字典删除该项,返回的该项是 以 键,值 元组形式

>>> a = {'n':1,'b':2}
>>> a.popitem()
('b', 2)

示例十 setdefault

setdefault  返回字典对应键值,如果不存在,返回默认值

>>> a = {'n':1111}
>>> print a.setdefault('n')
1111
>>> print a.setdefault('b','AA')
AA
>>> print a
{'b': 'AA', 'n': 1111}

示例十一 update

update 一个字典项更新另外一个字典

>>> a = {'b': 'AA', 'n': 1111}
>>> b = {'b':'cc'}
>>> a.update(b)
>>> a
{'b': 'cc', 'n': 1111}
>>> b = {'c':11}
>>> a.update(b)
>>> a
{'c': 11, 'b': 'cc', 'n': 1111}
>>>

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

示例十二   values 和 itervalues

values            以列表的形式放回字典中的值

iterkeyvalues  返回字典中值的迭代器

posted @ 2016-07-21 16:08  笨重的石头  阅读(685)  评论(0编辑  收藏  举报