1、【字典dict】

Python内置了字典:dict的支持,dict全称dictionary,

在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

字典和列表直观上不同的是,字典用的是方括弧'{}'括起来,列表用的是方括号'[]'。

例,假设要根据hero3人族兵种的级别查找对应的兵种,如果用list实现,需要两个list:

Lv = ['Lv1', 'Lv2', 'lv3']

hum_soldier = ['枪兵', '射手', '狮鹫']

给定一个级别,要查找对应的hum_soldier,就先要在Lv中找到对应的位置,

再从hum_soldier取出对应的兵种,list越长,耗时越长。

如果用dict实现,只需要一个“Lv”-“hum_soldier”的对照表,直接根据级别查找兵种,

无论这个表有多大,查找速度都不会变慢。(但是会占的内存比LIST多)

字典这种采用键值对的方式(key-value),储存大量关系性的数据,查询速度快。

字典的值:任意数据类型。只有值能对应上所有类型,它的键只可以对应上不可变类型的数据。

字典的键:属于不可变数据类型。且不能重复,唯一。

所以键可以是int,bool,str,tuple,但不能是列表。

如果你建立两个相同的键,后赋值那个会覆盖前面那个同名的键。

字典的顺序:

3.5之前,字典是无序的。

3.6开始,有优化,字典创建的时候,按照一定的顺序插入的数值,看起来变得更有序。

数据类型分类:

可变(不可哈希):list,dict,set(集合)---unhashable type

不可变(可哈希):int,bool,str,tuple ---hashable type

对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

(对原值没有发生改变,只是形成一个新的)

按容器(可承载各种数据类型)类型分:

容器类:list,tuple,dict

list列表,查询速度从头遍历到尾

disc字典,二分查找(有一个哈希表,每一个键[唯一]对应一个哈希值。

# hash
hum_soldier = {'lv1':'枪兵', 'lv2':'射手', 'lv3':'狮鹫'}
print(hash('lv1')) # 可查看键对应的哈希值 得出hash值:
1863379157542317326

2、对字典的操作;

【增】加键值的方法学习两种:

第一种:直接通过键修改值;

有则覆盖(改),无则添加。和列表的索引增加类似。

hum_soldier = {'lv1':'枪兵', 'lv2':'射手', 'lv3':'狮鹫'}
hum_soldier['lv4'] = '剑士'
print(hum_soldier) 可以看到无则添加成:
{'lv4': '剑士', 'lv2': '射手', 'lv1': '枪兵', 'lv3': '狮鹫'} 有则覆盖的例子,上面中lv1的键值对己有,我现在直接覆盖修改成兵种变成农民:
hum_soldier['lv1'] = '农民'
print(hum_soldier) 效果:{'lv2': '射手', 'lv4': '剑士', 'lv3': '狮鹫', 'lv1': '农民'}

所以如果不确定数据有没有,及数据不可以覆盖的情况下,建议用到接下来要说的第二种:

第二种:setdeafult(),无则添加,有则不变。对数据的保护更高,更严谨。

如果 key 在 字典中,返回对应的值。

如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。

比如同样接上文的例子,使用setdeafult()方法添加一组原来没有的键值对:

hum_soldier.setdefault('lv5', '僧侣')
print(hum_soldier) 输出可看到有添加:
{'lv1': '农民', 'lv2': '射手', 'lv5': '僧侣', 'lv3': '狮鹫', 'lv4': '剑士'} 再添加原来便有的lv2键尝试:
hum_soldier.setdefault('lv2', '神射手')
print(hum_soldier) 输出看到没有变化,lv2键对应的值依然是射手:
{'lv3': '狮鹫', 'lv2': '射手', 'lv5': '僧侣', 'lv4': '剑士', 'lv1': '农民'} 注意:同样由于setdefault()的这个特性,最好只在数据没有添加也不影响或有检查反馈的场合下用。 hum_soldier.setdefault('lv6')
也可以单纯只加一个键,默认键值为None,None也是常常会预留的。
很多时候我们新建的一个字典,就是先建好键,值都是默认None,后面再或获取或填入的。
{'lv3': '狮鹫', 'lv1': '农民', 'lv4': '剑士', 'lv2': '射手', 'lv6': None, 'lv5': '僧侣'}

利用setdeafult()的返回值特性,我们还可以尝试进行这样的操作:

hum_soldier = {'lv1': '农民', 'lv2': '射手', 'lv6': None, 'lv3': '狮鹫', 'lv5': '僧侣', 'lv4': '剑士'}

print('人类的一级兵种是:%s' % hum_soldier.setdefault('lv1', None))
print('人族的七级兵种是:%s' % hum_soldier.setdefault('lv7', None))
print(hum_soldier) 显示:
人类的一级兵种是:农民
人族的七级兵种是:None
{'lv1': '农民', 'lv6': None, 'lv5': '僧侣', 'lv3': '狮鹫', 'lv2': '射手', 'lv7': None, 'lv4': '剑士'}

【删除】的方法我们来学习四种:

1)【pop(key[,default)】

字典 pop() 方法删除字典给定键 key 所对应的值,返回值为被删除的值。

key值必须给出。 否则,返回default值。

例:

hum_soldier = {'lv1': '农民', 'lv2': '射手', 'lv6': None, 'lv3': '狮鹫', 'lv5': '僧侣', 'lv4': '剑士'}
print(hum_soldier.pop('lv1'))
print(hum_soldier) 显示:
农民
{'lv6': None, 'lv4': '剑士', 'lv7': None, 'lv5': '僧侣', 'lv3': '狮鹫', 'lv2': '射手'} hum_soldier.pop('lv8') #删除的时候没有此键的时候会报错
报错
Traceback (most recent call last):
File "E:/Python/day05/dict.py", line 26, in <module>
print(hum_soldier.pop('lv8'))
KeyError: 'lv8' hum_soldier.pop('lv9', None) #建议以这种写法,不报错而是返回你设定的值,一般是None来提醒自已没有此键。
返回
None
2)【popitem(key[,default)】

字典 popitem() 方法随机返回并删除字典中的一对键和值(一般删除末尾对)。

如果字典已经为空,却调用了此方法,就报出KeyError异常。

3)【clear()】清空字典所有元素,变空字典

例:

hum_soldier = {'lv1': '农民', 'lv2': '射手', 'lv3': '狮鹫', 'lv5': '僧侣', 'lv4': '剑士'}
print("人族兵种-字典长度为:%s" % len(hum_soldier))
hum_soldier.clear()
print("人族兵种-字典长度现为:%s" % len(hum_soldier)) 返回结果:
人族兵种-字典长度为:5
人族兵种-字典长度现为:0
4)【del】不详述,前面已有练习删除列表等。

del dict 删除字典

del dict['key'] 删除对应键值,没有时会报异常,所以建议一般使用pop来删除。

【改】的方法我们来学习两种:

第一种:直接通过键来修改(赋值)
hum_soldier = {'lv5': '僧侣', 'lv1': '农民', 'lv3': '狮鹫', 'lv2': '射手', 'lv4': '剑士'}
hum_soldier['lv1'] = '戟兵'
print(hum_soldier) 显示:
{'lv5': '僧侣', 'lv1': '戟兵', 'lv3': '狮鹫', 'lv2': '射手', 'lv4': '剑士'}
第二种:update()方法

dict.update(dict2)

将dict2键/值对,更新(覆盖并添加)到dict

(会覆盖,有相同会覆盖,没有的添加,和同步更新有点像)

hum_soldier = {'lv1':'枪兵', 'lv2':'射手', 'lv3':'狮鹫'}
hum = {'lv4':'剑士', 'lv5':'僧侣', 'lv1':'农民'}
hum_soldier.update(hum)
print(hum_soldier)
print(hum) 显示:(结果是hum_soldier字典中的枪兵被覆盖,再增加了剑士和僧侣,而hum字典保持不变。)
{'lv5': '僧侣', 'lv4': '剑士', 'lv2': '射手', 'lv1': '农民', 'lv3': '狮鹫'}
{'lv4': '剑士', 'lv5': '僧侣', 'lv1': '农民'}

【查】的方法我们来学习三种

1)dict['key']只能通过键查值,查不到的报错
2)通过in也可以判断key是否存在:

Python 字典 in 操作符用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false。

语法

in 操作符语法:

key in dict

参数

key -- 要在字典中查找的键。

返回值

如果键在字典里返回true,否则返回false。

hum = {'lv4':'剑士', 'lv5':'僧侣', 'lv1':'农民'}
print('lv2' in hum)
print('lv4' in hum) 显示:
False
True

注意是键-key,而不要弄成了判断值了。

3)dict.get('key')通过键得到对应的值,找不到键的默认返回None。

语法

get()方法语法:

dict.get(key, default=None)

参数

key -- 字典中要查找的键。

default -- 如果指定键的值不存在时,返回该默认值值。

返回值

返回指定键的值,如果值不在字典中返回默认值 None。

例:

hum = {'lv4':'剑士', 'lv5':'僧侣', 'lv1':'农民'}
print('人族4级兵种为:%s' % hum.get('lv4')) 显示:
人族4级兵种为:剑士

3、【其它方法】

dict.keys()

字典keys() 方法以列表返回一个字典所有的键。

把所有的键(不包括值)放到一个容器中,

本身没什么用,类似于列表(但没有索引),可以用于for循环迭代打印输出所有键等。

dict.keys() 循环打印出所有键时,等同直接dict;

(另外可用list转换成列表:list(dic.keys()))

特殊类型转换 dict 转化成 list,类似:

hum = {'lv4':'剑士', 'lv5':'僧侣', 'lv1':'农民'}
print(hum.keys())
hum_list = list(hum.keys())
print(hum_list) 显示结果:
dict_keys(['lv4', 'lv5', 'lv1'])
['lv4', 'lv5', 'lv1']

dict.values()

字典 values() 方法以列表返回字典中的所有值。

与keys相对,这次是把所有值放到一个列表中。与keys()用法可触类旁通,不再详述。

dict.items()

字典 items() 方法以列表返回可遍历的(键, 值) 元组数组。

这个就厉害了,返回的是成对的键/值,而且是遍历。

例:

hum = {'lv4':'剑士', 'lv5':'僧侣', 'lv1':'农民'}
print(hum.items()) 显示结果:
dict_items([('lv4', '剑士'), ('lv5', '僧侣'), ('lv1', '农民')])

字典 fromkeys()方法

fromkeys()方法从序列键和值设置为value来创建一个新的字典。

dict.fromkeys(seq[, value]))

参数

seq -- 这是将用于字典的键准备的值的列表。一般为可迭代的对像。

value -- 这是可选的,如果提供的话则值将被设置为这个值。

例:

dic ={}
lv1_soldier = ['骷髅', '枪兵', '小鬼', '大耳怪', '半人马', '小精灵', '妖精']
dic = dic.fromkeys(lv1_soldier, 'lv1')
print(dic) {'小鬼': 'lv1', '小精灵': 'lv1', '枪兵': 'lv1', '妖精': 'lv1', '半人马': 'lv1', '骷髅': 'lv1', '大耳怪': 'lv1'}

【分别赋值】

a,b = 2,3

a,b = (2,3)

a,b = [2,3] #前提,数量一一对应得上

输出的结果都是a=2 b=3

a = 4 , b = 5 只用一行代码赋值a和b的值互换?(面试题)

a,b = b,a

扩展,因为键和值也是成对的,所以很多情况下也可以用到分别(双双)赋值的这个技巧。

还可以加上for循环遍历技巧。

for k,v in dict.items()

这里的循环对应的k和v就是取字典里的键/值对。

【字典 dict.zip() 迭代分别赋值给键和值。】

两个列表合并成字典

例:

hum_soldier = ['枪兵', '射手', '狮鹫', '剑士', '僧侣', '骑士', '天使']
lv = ['lv' + str(i) for i in range(1,8)] #列表推导式直接做出lv1到lv7
print(lv)
dic = dict(zip(lv, hum_soldier)) #分别对应列表顺序赋值给字典
print(dic) ['lv1', 'lv2', 'lv3', 'lv4', 'lv5', 'lv6', 'lv7']
{'lv2': '射手', 'lv1': '枪兵', 'lv5': '僧侣', 'lv4': '剑士', 'lv7': '天使', 'lv3': '狮鹫', 'lv6': '骑士'} 使用zip函数还可以很方便反转键值(原本的值当键,原本的键变成值)
例如接上例继续操作反转: dic = dict(zip(dic.values(), dic.keys()))
print(dic)
{'狮鹫': 'lv3', '射手': 'lv2', '枪兵': 'lv1', '僧侣': 'lv5', '骑士': 'lv6', '剑士': 'lv4', '天使': 'lv7'}

4、【字典的嵌套】

字典通过键找值,列表通过索引找值;

例:

dic = {"name_list":['张三','lisi','隔壁王叔叔'],
'dic2':{'name':'太白','age':12},
} #1 ,给列表追加一个元素:'旺旺'
dic['name_list'].append('旺旺')
print(dic) #,2,给列表lisi全部大写
print(dic['name_list'][1]) #在不知道自已找的位置对不对的时候可以print调试看一下
# dic['name_list'][1] = 'LIST' #最low的时候可以直接赋值
dic['name_list'][1] = dic['name_list'][1].upper()
#print(dic) #3,给dic2 对应的字典添加一个键值对:hobby:girl.
dic['dic2']['hobby'] ='girl'
print(dic)

文:铁乐与猫

2018-3-22

end

铁乐学Python_day05-字典dict的更多相关文章

  1. 铁乐学python_day25_序列化模块

    铁乐学python_day25_序列化模块 部份内容摘自博客http://www.cnblogs.com/Eva-J/ 回顾内置方法: __len__ len(obj)的结果依赖于obj.__len_ ...

  2. 铁乐学python_Day38_多进程和multiprocess模块1

    铁乐学python_Day38_多进程和multiprocess模块1 [进程] 运行中的程序就是一个进程. 所有的进程都是通过它的父进程来创建的. 因此,运行起来的python程序也是一个进程,那么 ...

  3. 铁乐学Python_Day34_Socket模块2和黏包现象

    铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必 ...

  4. 铁乐学python_day24_面向对象进阶1_内置方法

    铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...

  5. 铁乐学python_day23_面向对象进阶1_反射

    铁乐学python_day23_面向对象进阶1_反射 以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ isinstance()和issubclass() 两者的返回值 ...

  6. python中几个常见的黑盒子之“字典dict” 与 “集合set”

    这里说到"字典dict" 和 "集合set"类型,首先,先了解一下,对于python来说,标准散列机制是有hash函数提供的,对于调用一个__hash__方法: ...

  7. Python中的元组(tuple)、列表(list)、字典(dict)

    -------------------------------更新中-------------------------------------- 元组(tuple): 元组常用小括号表示,即:(),元 ...

  8. python中字典dict的操作

    字典可存储任意类型的对象,由键和值(key - value)组成.字典也叫关联数组或哈希表. dict = {' , 'C' : [1 , 2 , 3] } dict['A'] = 007 # 修改字 ...

  9. python中的字典(dict),列表(list),元组(tuple)

    一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...

随机推荐

  1. Node.js压缩与解压数据

    Node.js中提供了一个很好的库Zlib来压缩解压数据. 一.压缩缓冲区 Zlib中有下面几个函数方便解压缩缓冲区. gzip/gunzip:标准gzip压缩. deflate/inflate:基于 ...

  2. 在百度搜索里展现网站LOGO

    我们经常在百度搜索一些网站可以看到一个网站在百度上展示的三个部分: 网站的名称 如(趣学车) 网站的描述 一段比较详细的对网站的介绍 网站的logo,一张logo图片 如下图 ------ 接下来我们 ...

  3. java基础之运算符与语句

    一.运算符 1.算数运算符 运算符 名称 举例 + 加法 A等于10,B等于3 则A+B=13 - 减法 A等于10,B等于3 则A-B=7 * 乘法 A等于10,B等于3 则A*B=30 / 除法 ...

  4. 悟空模式-java-单例模式

    [那座山,正当顶上,有一块仙石.其石有三丈六尺五寸高,有二丈四尺围圆.三丈六尺五寸高,按周天三百六十五度:二丈四尺围圆,按政历二十四气.上有九窍八孔,按九宫八卦.四面更无树木遮阴,左右倒有芝兰相衬.盖 ...

  5. element ui 时间控件 多个日期

    前言:工作中用到 vue+element ui 的前端框架,需要使用时间控件来选择多个日期,已月日的形式,且有默认值,所以记录一下.转载请注明出处:https://www.cnblogs.com/yu ...

  6. 项目Debug版本与Release版本的区别

    Debug版本:通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. Release版本:称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很 ...

  7. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  8. LeetCode CombinationSum II

    class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num ...

  9. spring AOP 动态代理和静态代理以及事务

    AOP(Aspect Oriented Programming),即面向切面编程 AOP技术,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装 ...

  10. AGC009:Eternal Average

    传送门 好神啊 直接考虑一棵 \(n+m\) 个叶子的 \(k\) 叉树,根结点权值为 \(\sum_{i\in m}(\frac{1}{k})^{deep_i}\) 对于一个 \(deep\) 的序 ...