欢迎来到我的博客园

python学习[第十一篇] 数据类型之 字典

python学习[第十一篇] 数据类型之 字典

字典概念

字典是python中唯一的映射类型。映射类型对象包括 键和值两部分,映射是一种一对多的关系。 

字典对象是可变的容器类型。能存储任意类型的python对象。

字典类型和序列类型的区别是存储和访问数据的方式不同。序列类型的键 通常称为索引,必须是整数类型。而字典的键可以是其他类型的对象。通常是字符串类型,映射类型是无序的。

字典的增删改查

字典的创建及赋值

#创建空的字典
adict={}
#创建非空的字典
adict={'key':'value'}
adict={'website':'http://127.0.0.1:','port':80}

使用字典内建函数来创建字典

#使用dict函数,接收一个元组为参数,返回一个字典
ddict=dict((['x',1],['y',2]))
>>> ddict
{'y': 2, 'x': 1}

#使用fromkeys()函数,接收一个元组作为参数返回一个字典

#使用fromkeys()函数,并赋予默认value值
>>> ddict={}.fromkeys(('x','y'),-1)
>>> ddict={}.formkeys(('x','y'),-1)
>>> ddict
{'y': -1, 'x': -1}
>>> ddict={}.fromkeys(('x','y'),(-1,-2))
>>> ddict
{'y': (-1, -2), 'x': (-1, -2)}
#使用fromkeys()函数 ,如果没有给出value值,默认为None
>>> ddict={}.fromkeys(('x','y'))
>>> ddict
{'y': None, 'x': None}

 

字典的访问

adict={'website':'http://127.0.0.1:','port':80}
#查询单一值
adict['website]

#遍历字典

for key in adict:
    print key,adict[key]

for key in adict.keys():
    print key,adict[key]

#判断 键是否在字典中
#key in dict

'website' in adict

如果我们范围单一的字典元素时,如果键不存在于字典中,会报KeyError

>>> adict={'website':'http://127.0.0.1:','port':80}
>>> adict['website1']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'website1'

 

字典的更新

#添加新的数据项
adict['username']='pzq'
#更新原有的数据项
adict['username']='pzq123'

 

字典删除

 

#删除字典的某一个数据项
del adict['username']

#删除字典的某一个数据项,并返回其值
adict.pop('username')

#清空整个字典
adict.clear()

#删除整个字典
del adict

 

操作符

标准类型操作符

对象值比较操作符  > >= < <= == != =

身份操作符 is is not

布尔操作符 and or not

字典操作符

切片操作符 []

#使用切片查看数据项
adict['username']

#使用切片修改数据项
adict['username']=’pzq'

 

成员操作符  in

判断 对象是否是字典的键

#判断字符串对象是否是字典的键
'username' in adict

 

映射类型内建函数及工厂函数

标准类型内建函数

cmp()函数

  1.  比较字典长度 如果长度不同,字典中的键的个数越多,字典越大。
  2.  比较字典的键 如果字典长度相同,那就比较字典的键,键的比较顺序和keys()方法返回的顺序相同。即hash后键的大小?
  3.  比较字典的值 如果字典长度相同,键也相同,则对字典中每一个键对应的值进行比较
  4.  完全匹配的话返回0

type() str() repr() 和其他类型没有什么区别

>>> adict = {'website':'http://127.0.0.1:','port':80}
>>> type(adict)
<type 'dict'>
>>> str(adict)
"{'website': 'http://127.0.0.1:', 'port': 80}"
>>> repr(adict)
"{'website': 'http://127.0.0.1:', 'port': 80}"

 

映射类型相关的函数

dict() 函数

dict 函数接收两种参数 序列参数和映射参数 即 dict(sequence) 和 dict(mapping)

 1 dict(sequence) 如果dict接收的参数是序列参数 ,即可迭代的参数例如 序列,迭代器,或支持迭代的对象那么这个可迭代的元素必须成对出现

>>> dict(zip(('x','y'),(1,2)))
{'y': 2, 'x': 1}

>>> dict([['x',1],['y',2]])
{'y': 2, 'x': 1}

>>> dict((['x',1],['y',2]))
{'y': 2, 'x': 1}

>>> dict([('xy'[i-1] ,i) for i in range(1,3)])
{'y': 2, 'x': 1}

2 dict(mapping) 如果dict接收的参数是映射对象,比如字典对象,会对其调用dict()函数会从存在的字典里复制内容除了生成新的字典。生成的字典是原来的字典的浅拷贝。 同内建方法copy()的作用是一样的,但是速度要比copy()方法慢

#通过映射生成dict8
>>> dict(x=1,y=2)
{'y': 2, 'x': 1}
>>> dict8=dict(x=1,y=2)
>>> dict8
{'y': 2, 'x': 1}
#通过**args生成 dict9
>>> dict9=dict(**dict8)
>>> dict9
{'y': 2, 'x': 1}

>>> dict9=dict8.copy()
>>> dict9
{'y': 2, 'x': 1}


#测试浅拷贝
>>> dict8=dict(x=[1,2],y=2)
>>> dict8
{'y': 2, 'x': [1, 2]}
>>> dict9=dict8.copy()
>>> dict9
{'y': 2, 'x': [1, 2]}
>>> dict8['x'][0]=11
>>> dict8
{'y': 2, 'x': [11, 2]}
>>> dict9
{'y': 2, 'x': [11, 2]}

#测试浅拷贝
>>> dict9=dict(**dict8)
>>> dict9
{'y': 2, 'x': [11, 2]}
>>> dict8['x'][0]=1
>>> dict8
{'y': 2, 'x': [1, 2]}
>>> dict9
{'y': 2, 'x': [1, 2]}

 

len 函数

len函数是统计dict中键的个数

>>> len(dict8)
2

 

hash()函数 

hash函数可以判断一个对象是否可以作为键,如果对象不是可hash的,会报TypeError

>>> hash('x')
-1819822983
>>> hash('y')
-1691822600
>>> hash('x')
-1819822983
>>> hash('x')
-1819822983
>>> hash('y')
-1691822600
>>> hash(['x','u'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

 

字典的内建方法

key有关的函数

dict.fromkeys(seq,value=None)创建并返回一个新字典,val作为所有键的值

dict.keys()  返回一个包含列表所有键列表

dict.has_key() 判断一个对象是否是字典的键 返回True或False

dict.get(key,default=None) 对字典的键,返回value,如果字典中不存在此键,则返回default值 

dict.pop(key,default=None) 和get方法类似,如果字典中key存在,删除并返回dict[key] .如果键值不存在且没有给出default值 则引发keyError

dict.iterkeys() 返回一个迭代对象。不是列表

dict.setdefault(key,default=None) 如果字典不存在key的键,则有dict[key] = default为他赋值

>>> adict=dict(x=1,y=2)  #创建一个字典
>>> adict
{'y': 2, 'x': 1}
#keys返回一个列表,列表中包含字典的所有键
>>> adict.keys()         
['y', 'x']
#dict.has_key() 判断一个对象是否是字典的键
>>> adict.has_key('x')
True
#dict.fromkeys() 通过fromkeys批量创建字典,如果值没有被指定,则默认为None
>>> adict.fromkeys(('x','y'),1)
{'y': 1, 'x': 1}


>>> adict=dict(x=1,y=2)
>>> adict
{'y': 2, 'x': 1}
#dict.get() 获取字典中对应键的值
>>> adict.get('x')
1
#dict.get() 如果输入的参数不存在如字典中则返回None
>>> adict.get('z')
>>> z=adict.get('z')
>>> z
>>> print z
None
#dict.get() 如果输入的参数符合键的要求,则报错TypeError
>>> z=adict.get(['z'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

#dict.get() 获取字典中对应键的值 ,并从字典中删除对应的数据项
>>> adict
{'y': 2, 'x': 1}
>>> adict.pop('x')
1
>>> adict
{'y': 2}
#iterkeys()方法与非迭代方法一样,不同的是返回一个迭代子。而不是一个对象
>>> for x in adict.iterkeys():
... print x
y

#setdefault 方法,为键值设置默认值,如果不存在则dict[key]=value添加新的数据项,存在则返回此key对应的值,不会修改值为None的key的值,
>>> adict
{'y': 2}
>>> adict.setdefault('y',default=3)
2
#key不存在,没有设置default值 则使用None为其赋值

  >>> adict.setdefault('x')
  >>> adict
  {'y': 2, 'x': None}

  #key存在值为None,则什么都不做返回None
  >>> adict.setdefault('x',1)
  >>> adict
  {'y': 2, 'x': None}

 

value 有关的函数

 dict.values() 返回一个包含字典所有值的列表

dict.itervalues() 同dict.itervalues()

>>> adict
{'y': 2, 'x': None}
#values返回字典所有值的列表
>>> adict.values()
[2, None]
#itervalues 返回字典所有值的迭代
>>> for y in adict.itervalues():
...     print y
...
2
None

 

键值对相关函数

dict.items() 返回字典中键值对元组的列表(即每一个键值以元组存放,整个结果为列表)

dict.iteritems()  返回列表中键值对的迭代

dict.update(dict2) 将dict2的键值存添加到dict中 

dict.copy() 返回一个字典的浅拷贝

>>> adict
{'y': 2, 'x': None}
#items将每对键值以元组形式存放,然后返回一个列表
>>> adict.items()
[('y', 2), ('x', None)]
#iteritems 将每对键值返回为一个迭代
>>> for x,y in adict.iteritems():
...     print x,y
...
y 2
x None

>>> adict2={'z':3}
>>> adict
{'y': 2, 'x': None}
#update中待添加的字典的键不存在则将新的键值对加入到字典中,返回None
>>> adict.update(adict2)
>>> adict
{'y': 2, 'x': None, 'z': 3}
#update中带添加的键存在则将修改原有的键对应的值为带添加的值,返回None
>>> adict3={'y':4}
>>> adict.update(adict3)
>>> adict
{'y': 4, 'x': None, 'z': 3}
>>> x=adict.update(adict3)
>>> print x
None

#使用itemitems实现items方法
>>> ret=[]
>>> for x,y in adict.iteritems():
...     ret.append((x,y))
...
>>> print ret
[('y', 4), ('x', None), ('z', 3)]

#copy函数,返回浅拷贝
>>> adict_c=adict.copy()
>>> adict_c
{'y': 4, 'x': None, 'z': 3}
>>>

字典的键的原则

不允许一个键对应多个值

每个键只能对应一个值,当有键发生冲突时,取最后的赋值作为键的值,即python从左到右检查键值对。给字典赋值时,如果一个键不存在,则会被创建和添加,如果键已经存在则此键所对应的值将被替换。

#故意定义了重复的键,取右边的值为最终的值
>>> adict={'x':1,'x':2}
>>> adict
{'x': 2}
#使用切片方法赋值,当键不存在时,将键值添加到字典中
>>> adict['y'] = 2
>>> adict
{'y': 2, 'x': 2}
#使用切片方法赋值,当键已存在时,将对应的键值修改为最后的值
>>> adict['y'] = 3
>>> adict
{'y': 3, 'x': 2}

 

键必须是可hash的

python 内建的数据类型中 ,字典和列表是可变类型,因为他们是不能hash的,所以不能作为字典的键。所有不可变的类型都是可哈希的,都可以作为字典的键。

如果自定义的对象实现了__hash__方法,并返回一个固定的值,那么这个对象也可以作为键。

>>> class Person():
...     def __init__(self,name,age):
...         self.name = name
...         self.age = age
...     def __hash__(self):
...         return hash(self.name+str(self.age))
...
>>> ttt=Person('xxx',12)
>>> print ttt
<__main__.Person instance at 0x02BB0A80>
>>> yyy=Person('xxx',12)
>>> print ttt.__hash__
<bound method Person.__hash__ of <__main__.Person instance at 0x02BB0A80>>
>>> print yyy.__hash__
<bound method Person.__hash__ of <__main__.Person instance at 0x02BB09E0>>
>>> u={ttt:'z'}
>>> u
{<__main__.Person instance at 0x02BB0A80>: 'z'}
>>> print u
{<__main__.Person instance at 0x02BB0A80>: 'z'}

 

 

 

###### end

posted @ 2018-07-17 18:11  panzq  阅读(170)  评论(0编辑  收藏  举报