字典是最与php的数组相似的序列结构。python的列表只能是以索引数字开头并且顺序递增的序列。字典则可以是以字母为key的序列。
元组一般用圆括号来表示,如(1,2,3)
列表一般用方括号来表示,如[1,2,3]
而字典(dict)则用大括号来表示,如{‘a':1,’b':2,’c':3}
与php不同,php的key,value是用key=>value来表示,python而是用冒号“:”来分隔。
字典可以使用大括号书写键和值或使用dict函数来创建。
dict函数可以指定两个元组或列表来对应创建字典。如:
items = [(‘name’,’gumby’),(‘age’,’42’)]
d = dict(items)
与列表的区别:
k in d(d为字典),查找的是键,而非value,表达式 v in l(l为列表)则用来查找值,而不是索引。
一些字典方法:
clear 清除字典。“原地操作”,不会返回值,类似于列表的sort方法
copy方法返回一个相同键值对儿的新字典。浅复制。因为值本身就是相同的,而不是副本。
在副本中替换值的时候,原始字典不受影响。但是如果修改了某个值,原始字典也会改变。避免这个问题的一种方法就是使用深度复制(deep copy)。
from copy import deepcopy
deepcopy(d)
d.fromkes方法使用给定的值创建新字典。每个键默认对应的是None
get方法获取一个不存在的键时,不会报错,会返回None
has_key方法相法于表达式k in d
items方法将所有的字母项以列表的方式返回。这些列表中的每一项都来自于(键,值)。但是项在返回时没有特殊的顺序。
iteritmes的方法大致相同,但是会返回一个迭代器对象而不是列表。在很多情况下iteritems效率更高。迭代器,相当于decode json之后的对象,而非数组、
keys方法将字典中的键以列表的形式返回。而iterkeys则返回针对键的迭代器。
pop弹出给定键的值。popitem会弹出最后一个元素(实际上是随机项),但如果想一个接一个地移除并处理字典,popitem效率就会高很多,因为不必先获取字典的键值列表。
values和itervalues方法以列表或迭代器的形式返回字典中的值,返回值的列表可以包含重复项。
内置数据类型
1. Dictionary是一个内置数据类型,定义了键和值之间一对一的关系,类似java里的hashtable的实例,他是无序的,key是大小写敏感的
与java不同的是,key只能是字符串,整数或者基本类型,value是可以是不同数据类型的值,
del可以用key删除元素,用clear清空
keys返回key的list,values返回值的list,items()返回一个dictionary的tuple
2. List:更像java里的数组,ArrayList
可以采用负数索引,从list的尾部开始向前计数
直接用a[1:n]实现list的分片
直接append在队尾添加元素,在insert(pos, obj)在pos出加元素,extend连接list
直接用index找元素在list中的位置,没找到时会引发异常,可以用in判断是否在
直接用remove删除元素,可以直接用pop得到并删除以后一个元素
list可以用*运算符,当做重复器。[1,2]*3 = [1,2,1,2,1,2]
简单方法将list中的每个元素应用一个函数,映射为另一个list
li=[1,2,3,4]
[elem*2 for elem in li]
[2,4,6,8]
3. Tuple: 不可变的list,tuple可以用作dictionary的key
tuple可以用于一次赋值多个值
4. 变量没有定义,首次赋值产生,当超出作用域就自动消亡
变量赋值可以分行,用作为续行符
不能使用一个没有赋值的变量
5. range可以用来返回一个整数的list
6. python可以支持格式化字符串,将一个值插于在%s的位置
“string template contains %s" %(params);
%d表示整数, %f表示浮点数(6位小数), %.2f表示两位小数,%+。2f表示打印正负
7. ";".join(list)用";"将list里的元素连接
string.split(";")对应是将字符串分割
1.1 创建字典
Python有两种方法可以创建字典,第一种是使用花括号,另一种是使用内建 函数dict
>>> info = {}
>>> info = dict()
1.2 初始化字典
Python可以在创建字典的时候初始化字典
>>> info = {"name" : 'cold'}
>>> info = dict(name = 'cold') # 更优雅
很明显第二种方法更加的优雅和减少一些特殊字符的输入,但是有种情况第二种不能胜任
>>> key = 'name'
>>> info = { key :'cold'} # {'name':'cold'}
>>> info = dict(key = 'cold') # {'key': 'cold'}
明显第二种方法就会引发一个不容易找到的bug
Python字典还有一种初始化方式,就是使用字典的fromkeys方法可以从列表中获取元素作为键并用None或fromkeys方法的第二个参数初始化
>>> info = {}.fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'], '111com.net')
>>> info
{'blog': '111com.net', 'name': '111com.net'}
1.3 优雅的获取键值
字典可以这样获取到键的值
>>> info = {'name':'cold', 'blog':'111com.net'}
>>> info['name']
'cold'
但是如果获取不存在的键的值就会触发的一个KeyError异常,字典有一个get方法,可以使用字典get方法更加优雅的获取字典
>>> info = dict(name= 'cold', blog='www.111com.net')
>>> info.get('name')
'cold'
>>> info.get('blogname')
None
>>> info.get('blogname', 'linuxzen')
'linuxzen'
我们看到使用get方法获取不存在的键值的时候不会触发异常,同时get方法接收两个参数,当不存在该键的时候就会返回第二个参数的值 我们可以看到使用get更加的优雅
1.4 更新/添加
Python 字典可以使用键作为索引来访问/更新/添加值
>>> info = dict()
>>> info['name'] = 'cold'
>>> info['blog'] = '111com.net'
>>> info
{'blog': '111com.net', 'name': 'cold'}
>>> info
{'blog': '111com.net', 'name': 'cold night'}
同时Python字典的update方法也可以更新和添加字典
>>> info = dict(name='cold', blog='111com.net')
>>> info.update({'name':'cold night', 'blogname':'linuxzen'})
>>> info
{'blog': '111com.net', 'name': 'cold night', 'blogname': 'linuxzen'}
>>> info.update(name='cold', blog='www.111com.net') # 更优雅
>>> info
{'blog': 'www.111com.net', 'name': 'cold', 'blogname': 'linuxzen'}
Python字典的update方法可以使用一个字典来更新字典,也可以使用参数传递类似dict函数一样的方式更新一个字典,上面代码中哦功能的第二个更加优雅,但是同样和dict函数类似,键是变量时也只取字面值
1.5 字典删除
可以调用Python内置关键字del来删除一个键值
>>> info = dict(name='cold', blog='111com.net')
>>> info
{'blog': '111com.net', 'name': 'cold'}
>>> del info['name']
>>> info
{'blog': '111com.net'}
同时也可以使用字典的pop方法来取出一个键值,并删除
>>> info = dict(name='cold', blog='111com.net')
>>> info.pop('name')
'cold'
>>> info
{'blog': '111com.net'}
1.6 其他操作
获取所有key
>>> info = dict(name='cold', blog='111com.net')
>>> info.keys()
['blog', 'name']
获取key,value并循环
>>> info = dict(name='cold', blog='111com.net')
>>> for key, value in info.items():
... print key, ':', value
...
blog : 111com.net
name : cold
方法一:
>>> dict1 = {}
>>> dict2 = {'name': 'earth', 'port': 80}
>>> dict1, dict2
({}, {'port': 80, 'name': 'earth'})
方法二:从Python 2.2 版本起,可以使用一个工厂方法,传入一个元素是列表的元组作为参数
>>> fdict = dict((['x', 1], ['y', 2]))
>>> fdict
{'y': 2, 'x': 1}
方法三:
从Python 2.3 版本起, 可以用一个很方便的内建方法fromkeys() 来创建一个"默认"字典, 字典中元素具有相同的值 (如果没有给出, 默认为None,这个有点像我框架的oneObject方法):
>>> ddict = {}.fromkeys(('x', 'y'), -1)
>>> ddict
{'y': -1, 'x': -1}
>>>
>>> edict = {}.fromkeys(('foo', 'bar'))
>>> edict
{'foo': None, 'bar': None}
访问字典中的值
想遍历一个字典(一般用键), 你只需要循环查看它的键, 像这样:
>>> dict2 = {'name': 'earth', 'port': 80}
>>>
>>>> for key in dict2.keys():
... print 'key=%s, value=%s' % (key, dict2[key])
...
key=name, value=earth
key=port, value=80
从Python 2.2 开始,可以直接在 for 循环里遍历字典。
>>> dict2 = {'name': 'earth', 'port': 80}
>>>
>>>> for key in dict2:
... print 'key=%s, value=%s' % (key, dict2[key])
...
key=name, value=earth
key=port, value=80
想判定其是否存在某个键值对,可以使用has_key()或 in 、 not in 操作符
>>> 'server' in dict2 # 或 dict2.has_key('server')
False
>>> 'name' in dict # 或 dict2.has_key('name')
True
>>> dict2['name']
'earth'
一个字典中混用数字和字符串的例子:
>>> dict3 = {}
>>> dict3[1] = 'abc'
>>> dict3['1'] = 3.14159
>>> dict3[3.2] = 'xyz'
>>> dict3
{3.2: 'xyz', 1: 'abc', '1': 3.14159}
更新字典
采取覆盖更新
上例中 dict2['name']='earth';
更新 dict2['name']='abc';
删除字典元素和字典
del dict2['name'] # 删除键为“name”的条目
dict2.clear() # 删除dict2 中所有的条目
del dict2 # 删除整个dict2 字典
dict2.pop('name') # 删除并返回键为“name”的条目
dict2 = {'name': 'earth', 'port': 80}
>>> dict2.keys()
['port', 'name']
>>>
>>> dict2.values()
[80, 'earth']
>>>
>>> dict2.items()
[('port', 80), ('name', 'earth')]
>>>
>>> for eachKey in dict2.keys():
... print 'dict2 key', eachKey, 'has value', dict2[eachKey]
...
dict2 key port has value 80
dict2 key name has value earth
update()方法可以用来将一个字典的内容添加到另外一个字典中
dict3 = {'server': 'http', 'port': 80, 'host': 'venus'}
>>> dict3.clear()
>>> dict3
{}
映射类型相关的函数
>>> dict(x=1, y=2)
{'y': 2, 'x': 1}
>>> dict8 = dict(x=1, y=2)
>>> dict8
{'y': 2, 'x': 1}
>>> dict9 = dict(**dict8)
>>> dict9
{'y': 2, 'x': 1}
dict9 = dict8.copy()
字典内建方法
方法名字 | 操作 |
---|---|
dict.clear() | 删除字典中所有元素 |
dict.copy() | 返回字典(浅复制)的一个副本 |
dict.fromkeysc(seq,val=None) | 创建并返回一个新字典,以seq 中的元素做该字典的键,val 做该字典中所有键对应的初始值(如果不提供此值,则默认为None) |
dict.get(key,default=None) | 对字典dict 中的键key,返回它对应的值value,如果字典中不存在此键,则返回default 的值(注意,参数default 的默认值为None) |
dict.has_key(key) | 如果键(key)在字典中存在,返回True,否则返回False. 在Python2.2版本引入in 和not in 后,此方法几乎已废弃不用了,但仍提供一个 可工作的接口。 |
dict.items() | 返回一个包含字典中(键, 值)对元组的列表 |
dict.keys() | 返回一个包含字典中键的列表 |
dict.values() | 返回一个包含字典中所有值的列表 |
dict.iter() | 方法iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。 |
dict.pop(key[, default]) | 和方法get()相似,如果字典中key 键存在,删除并返回dict[key],如果key 键不存在,且没有给出default 的值,引发KeyError 异常。 |
dict.setdefault(key,default=None) | 和方法set()相似,如果字典中不存在key 键,由dict[key]=default 为它赋值。 |
dict.setdefault(key,default=None) | 和方法set()相似,如果字典中不存在key 键,由dict[key]=default 为它赋值。 |