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. java面试⑤前端部分

    2.4.1 简单说一下HTML,CSS,javaScript在网页开发中的定位? 2.4.2简单介绍一下AJAX 2.4.3 JS和JQuery的关系 2.4.4 JQuery的常用选择器 2.4.5 ...

  2. Android源码博客目录

    每次都找不到,干脆每个部分都开个目录,方便找 0. 杂项 一些Android的博客,没事翻翻 1. 构建相关 linux和Android的Makefile和android.mk android 目录下 ...

  3. OpenStack Identity(Keystone)概述及示例

    OpenStack 的验证服务有两个主要功能: 1. 用户管理(租户.用户.权限) 2. Service catalog,管理服务的目录和它们的endpoint. 相关概念 1. User User即 ...

  4. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  5. SQL Server如何存储特殊字符、上标、下标

    测试验证特殊符号能否存入数据库中: 其中,像一些普通单位符号比如“ ° ′"﹩ $ ﹠ & £¥ ‰ % ℃ ¤ ¢℉”可以正常录入没有问题,但是万分号“‱”之上就不可以了,录入后显 ...

  6. 从 Hadoop 1.0 到 Hadoop 2.0 ,你需要了解这些

    学习大数据,刚开始接触的是 Hadoop 1.0,然后过度到 Hadoop 2.0 ,这里为了书写方便,本文中 Hadoop 1.0 采用 HV1 的缩写方式,Hadoop 2.0 采用 HV2 的缩 ...

  7. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. PHP中常用的魔术方法

    我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(), ...

  9. 如何去掉iview里面的input,button等一系列标签自带的蓝色边框

    只需要将这些标签加一个:focus{outline:0}即可解决这个问题

  10. 自己编写jQuery插件 之 无缝滚动

    一. 效果图 二. Html骨架结构 <div class="box"> <ul> <li>1</li> <li>2&l ...