字典

  字典是python中一种键值映射类型,采用key-value的存储方式。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。(如果可变,那hash又要重新计算,对应关系常常改就不行了)。 但是在3.6中,字典变成了有序。

  字典与列表的区别

      字典是通过键来存取的,hash键值来进行村春,查找速度飞快

      列表是通过索引来存取的

一、定义字典

book = {
    'name':'python',
    'price':88
}
##############
也支持嵌套的方式
book = {
    'name':'python',
    'price':88
    ‘publish’:{
        'name':'北京出版社',
        ‘addr’:'北京裤衩楼'
    }
}

 

二、字典增删改查

2.1 增加

第一种单层
dict1 = {'user':'lh','password':'lou123'}
dict1['id'] = 5
print(dict1)

运行结果:
{'user': 'lh', 'password': 'lou123', 'id': 5}

第二种多层:
lh = { 'name':'louhui','city':'hangzhou'}
book={'name':'python','prince':88}
lh['book'] = book

2.2 删除

1) del python内置函数
dict1 = {'user':'lh','password':'lou123'}
del dict1['id']   #删除单项
del dict1         #删除字典,变量都不存在了

2)clearn 字典方法
dict1.clear()   #清空字典的项,但是字典的变量名还存在

 

2.3 修改

dict['id'] = 2  #如果id不存在就是增加了,存在就修改了,比较灵活

 

2.4 查

1. 取值

取值有两种方式:

一、直接使用key,key不存在则报错
dict1['name']
dict1['book']['name']   #嵌套的方式下

二、使用get查找,key不存在不会报错,可定义不存在的返回值,默认是None
dict1.get('name')
dict.get('book').get('name')

 

2.查询key

dict1 = {'user':'lh','password':'lou123','id':1}
s=dict1.keys()       # 注意这个是一个dict_keys类型,看着像列表,但不能使用索引的方式去取值,是一个可迭代的对象
li = [i for i in s]  #使用列表推导式去转换
print(li)

 

3. 查询items

for item in dict1.items()
for k,v in   dict1.items()

dict.items()的返回值也是一个类似列表的序列,但是也不能使用所用的方式

 2.5 设置默认值的两种方法

1.使用字典的方法 setdefault

  setdefault的用法比较灵活

    •   当key已经存在的时候,返回对应key的v
    •   当key不存在的时候,直接设置值
my_dict = {}
my_dict['a']   #直接报错!

my_dict.setdefault('a','good')   #设置了一个默认值

2.使用第三方库

>>> from collections import defaultdict
>>> todo = defaultdict(lambda:'noting')
>>> todo['a']
'noting'

 

 

三、字典的内置方法

  字典的内置方法,就辣么几个,我们一起征服吧!

 

 clear(...)

  D.clear() -> None. Remove all items from D. 

  无返回值,清空所有的项。

D = {'a':1,}
D.clear()


COPY

   D.copy() -> a shallow copy of D。

  浅拷贝。 后面再介绍

fromkeys

    fromkeys(iterable, value=None, /) from builtins.type

   Returns a new dict with keys from iterable and values equal to value.

   方便生产一个列表。

  两个参数:

    第一个参数是一个可迭代的数据结构(str,list等)

    第二个参数是value,默认是None

dict1 = dict.fromkeys([1,2,3])    #不赋值,默认为None
dict2 = dict.fromkeys('efsas','hui')
print(dict1)
print(dict2)

运行结果:
{1: None, 2: None, 3: None}
{'e': 'hui', 'f': 'hui', 's': 'hui', 'a': 'hui'}

get

  D.get(k [,d]) -> D[k] if k in D, else d. d defaults to None.

  有两个参数,第二个参数可选([]代表可选)。 如果存在key,则返回对应的值,如果不存在则为 第二个参数(第二参数默认为None)。

dict1 = {'name':'louhui','age':19}
print(dict1.get('x','没有找到啊!'))

运行结果:
没有找到啊!

items
  D.items() -> a set-like object providing a view on D's items
  返回一个类似列表 包含多个二元数组。 在上面 查的方法有介绍。

dict1 = {'name':'louhui','age':19}
print(dict1.items())

运行结果:
dict_items([('name', 'louhui'), ('age', 19)])

keys

 D.keys() -> a set-like object providing a view on D's keys
  在上面查key有介绍
pop
  D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
  If key is not found, d is returned if given, otherwise KeyError is raised

  删除指定key,并返回相对应的v。

  如果key不存在,第二参数存在,则返回第二参数。否则报错

>>> a = {'name':'hui','age':18}
>>> a.pop('name')
'hui'
>>> a.pop('name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> a.pop('age','wo')
18
>>> a.pop('age','wo')
'wo'

popitem(...)
  
D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple; but raise KeyError if D is empty.

  随机返回并删除字典中的一对键和值。删完以后就报错。

dict1 = {'name':'louhui','age':19,'city':'hangzhou'}
print(dict1.popitem())
print(dict1)

运行结果:
{'city':'hangzhou'}
{'name': 'louhui', 'age': 19}

但在python3.6中好像变成了 删除最后一个item了,3.6中字典变成了有序了

 

 

setdefault(...)
  D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

  和get有点类似。如果key存在则不改变,如果key不存在就增加这个key。

dict1 = {'name':'hui','age':18}
dict1.setdefault('id')
print(dict1)
dict1.setdefault('book','python')
print(dict1)
dict1.setdefault('name','lh')
print(dict1)

运行结果
{'name': 'hui', 'age': 18, 'id': None}              #key不在字典中,直接增加,默认为None
{'name': 'hui', 'age': 18, 'id': None, 'book': 'python'} #key不在字典中,直接增加第二参数的v,并返回v
{'name': 'hui', 'age': 18, 'id': None, 'book': 'python'} #key存在,不修改,并返回对应的v

update(...)
  D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
   If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
  If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v
  In either case, this is followed by: for k in F: D[k] = F[k]

  说简单点就是 

    dict1.update(dict1)  把字典dict2的键/值对更新到dict1里

dict1 = {'name':'louhui','age':18}
dict2 = {'id':1}
dict1.update(dict2)
print(dict1)

运行结果:
{'name': 'louhui', 'age': 18, 'id': 1}

values(...)
  D.values() -> an object providing a view on D's values

  返回字典中所有的v,用一个类似列表的方式存储。

dict1.values()
dict_values(['louhui', 18, 1])

 

  

  

 

 

 

  

posted @ 2018-04-19 23:55  娄先生  阅读(217)  评论(0编辑  收藏  举报
levels of contents