python学习之数据类型(dic)
3.8 字典
3.8.1 字典的介绍
字典(dict)是python中唯一的一个映射类型,它是以{ }括起来的键值对组成,在dict中key是唯一的。在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,在dict中存储的key-value中的key必须是可hash的,可以改变的都是不可哈希的,那么可哈希就意味着不可变。这个是为了能准确的计算内存地址而规定的。已知的可哈希(不可变)的数据类型: int, str, tuple, bool;不可哈希(可变)的数据类型: list, dict, set
字典能够存储大量的数据,比列表还要大;字典查找数值更方便;对数据可以进行关联;字典比较消耗内存
有明确对应关系时,推荐使用字典
语法 :
{key1: value1, key2: value2....}
注意: key必须是不可变(可哈希)的,value没有要求。可以保存任意类型的数据,因为key的存在,字典的查询效率非常的高。
dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅哥', '美女'], (1, 2, 3): '麻花藤'}
#合法
print(dic[123])
print(dic[True])
print(dic['id'])
print(dic['stu'])
print(dic[(1, 2, 3)])
#不合法
dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不不能作为key
dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key
dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,而hash表是不连续的,所以不能进行切片工作,它只能通过key来获取dict中的数据
3.8.2 字典的相关操作
1.增加
常规:dic[key] = value
#增加
dic = {}
dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增一个key-value的组合进dict
dic['age'] = 18
print(dic)
不可替换:dic.setdefault('Key','value')
如果key已经在字典中出现过了,那么这条命令就不进行增加操作。
# 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值
dic.setdefault('盖伦') # 也可以往里面设置值
dic.setdefault("盖伦", "德玛西亚") # 如果dict中已经存在了,那么setdefault将不会起作用
print(dic)
2.删除
dic.popitem() #随即删除
dic.pop('Key') #定向删除,返回被删除的value
del dic[Key] #del删除指定的键值对
dic.clear() #清空,得到一个空的字典
注意:当字典在迭代过程中,是不能进行删除或添加操作,因为迭代是无序的。如果要进行删除操作,把要删除的元素暂时先保存在⼀个list中,然后循环list,对dic进行删除操作。
3.修改和查询
修改
dic['Key'] = 新的value key再字典中存在,就是修改;key不在字典时,就添加
dic.update(dic2) #dic2中的Key与dic里的key一致时,替换value;如果dic2中的key不存在dic中,则在dic中新增该键值对;如果dic中有dic2没有的Key则该键值对保持不变。
查询
print( dic[key] ) #key不存在时会报错;可以使用加减乘除运算
dic[key] += 5
print( dic.get(key,key不存在时返回的内容) #key不存在时返回None,该返回值可自定义;不能对其进行赋值
setdefault('key') ##1.新增(先看有没有Key,如果有直接进行查询;如果没有,则新增然后查询返回value) 2.根据key把value值返回
4.遍历
字典的遍历--keys()
输出的是一个dict_keys类型的列表,可以进行for循环,但是不能使用索引。
### 字典的遍历
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.keys()) #高仿列表,类型是dict_keys
for key in dic.keys():
print(key) #拿到key
print(dic[key]) #拿到value,实现对value的遍历
字典的遍历--values()
输出的也是一个dict_keys类型的列表,可以进行for循环,但是不能使用索引。
注意:通过key可以找到value但是通过value找不到key!!
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.values()) #通过value是拿不到Key的
for value in dic.values(): #只能遍历value
print(value)
字典的遍历--键值对items()
只有元组的列表,元组里边是键值对
[(key1,value1),(key2,value2),(key3,value3)...]
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.items()) #只有元组的列表,元组里边是键值对信息
for item in dic.items():
print(item) #输出的是元组
print(item[0],item[1])
字典的遍历--脑路清奇版
首先,介绍一个解包小知识,解包时前边变量的个数必须与后边解包的个数必须一致。
a,b = (10,20) #解构,解包,元组、列表都具有该功能
print(a)
print(b)
###前边变量的个数必须与后边解包的个数必须一致
a,b,c = '你好啊'
print(a,c) #输出 你 啊
实现:当需要遍历字典,在操作中涉及到key和value的时候,直接版是最佳选择
#含蓄版
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
for item in dic.items():
k,v = item
print(k)
print(v)
#直接版
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
for k,v in dic.items():
print(k)
print(v)
字典的遍历--key迭代版
因为字典本身就是一个可迭代的对象,可以直接进行for循环
#先看一下如果直接对字典进行迭代的话会是什么情况
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
for el in dic:
print(el) #直接输出的只有Key,那么是不是可以用key把value给印出来呢?
print(dic[el]) #答案是可以的
5.字典的嵌套
在写字典嵌套时,一点更要注意元素与元素之间不要忘记加逗号。
dic = {
'name' : '盖伦',
'age' : 24,
'slogan' :'德玛西亚',
'family': {
'皇子' : '嘉文四世',
'总管' : '赵信',
'女警' : {
'name' : '凯特琳',
'age' : 23 ,
'slogan':'我,miss,怎么可能'
}
} ,
'equipment': [
{'num1':'黑切','use':'kill','gank':'Yes'},
{'num2':'日炎','use':'堆肉','gank':'No'}
]
}
print(dic['equipment'][1]['gank']) #查看盖伦第二个装备是否适合gank
dic['family']['总管'] = dic['family']['总管'] + '总管' #修改德邦的信息
print(dic['family']['总管'] )
6. enumerate(dict,start)枚举
给要迭代的对象加一个序号;
把字典的key与数字结合起来,输出一个元组;start默认从0开始,可以修改成任意值
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
for i,k in enumerate(dic,1):
print(i,k)
#输出
1 盖伦
2 戴安娜
3 猴哥
字符串和列表中也可以使用。
7. fromkeys()
formkeys()的作用是帮助我们通过list创建字典,它是一种类的方法,它不直接对应对象,即能创建新的字典,不能更改已创建的字典。
语法:dic = fromkeys(keys,values),这里的key和value都是列表
keys用的是同一个value,如下:
lis = ['德玛西亚之力','皇子','赵信','女警']
lis1 = ['lol','英雄联盟']
d = dict.fromkeys(lis1,lis)
print(d)
print(id('lol'),id('英雄联盟'))#查看两个key的ID
#输出
{'lol': ['德玛西亚之力', '皇子', '赵信', '女警'], '英雄联盟': ['德玛西亚之力', '皇子', '赵信', '女警']}
2248951452984 2248950434288 #两个key的ID相同
看大坑来了:当对一个key的value进行修改时,会直接同步给其他的key。
当对'lol'的value进行修改时,因为与'德玛西亚'共用一组value,因此会直接影响'德玛西亚',如下:
d.get('lol').append('李菁')
print(d)
#输出
{'lol': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁'], '英雄联盟': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁']}
python学习之数据类型(dic)的更多相关文章
- python学习6—数据类型之集合与字符串格式化
python学习6—数据类型之集合与字符串格式化 1. 使用id()可以查看一个变量的内存地址: name = 'alex' id(name) 2. 进制转换 十进制转换为二进制等: a = 10 # ...
- Python学习 之 数据类型(邹琪鲜 milo)
1.Python中的数据类型:数字.字符串.列表.元组.字典 2.数字类型包括整型.长整型.浮点型.复数型 type(number):获取number的数据类型 整型(int):范围:-2,147,4 ...
- python学习3—数据类型之整型、字符串和布尔值
python学习3-数据类型之整型.字符串和布尔值 数据类型 python3支持的数据类型共有6种: 1 Number 2 String 3 List 4 Tuple 5 Set 6 Dictiona ...
- Python学习之数据类型
整数 Python可以处理任意大小的整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如: ...
- python学习:数据类型
python有两种索引方式.一种从左至右,下标从0开始:一种从右至左,下标从-1开始. python有六种数据类型: 不可变数据(四个):Number(数字).String(字符串).Tuple(元组 ...
- python学习之数据类型(List)
3.5 列表 3.5.1 列表的介绍 列表是python的基础数据类型之⼀,其他编程语言也有类似的数据类型. 比如JS中的数组, java中的数组等等.它是以[ ]括起来, 每个元素⽤' , '隔 ...
- python学习Day7 数据类型的转换,字符编码演变历程
一.数据类型的转换 1.1.1.字符转列表:lst1 = str.split(默认空格,也可依据指定字符分界),若无分界字符,就没法拆分,这时可以直接放进list转成列表 ----> s1 = ...
- python学习day7 数据类型及内置方法补充
http://www.cnblogs.com/linhaifeng/articles/7133357.html#_label4 1.列表类型 用途:记录多个值(一般存放同属性的值) 定义方法 在[]内 ...
- python学习day4 数据类型 if语句
1.变量的内存管理 cpython解释器垃圾回收机制 什么是垃圾,当一个值身上没有绑定变量名时,(该值的引用计数=0时)就是一个垃圾 age=18 #18的引用计数=1 x=age #18的引用计数 ...
随机推荐
- 第五章 动画 44:动画-使用第三方animate.css类库实现动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- tcpdump工具抓到的cap文件
一.链路层 ---> 以太网数据包 一个数据包被称为一帧, 制定这个规则的协议就是以太网协议.一个完整的以太网数据包如下图所示: 整个数据帧由首部.数据和尾部三部分组成,首部固定为14个字节 ...
- Five minutes to understand async and defer
Script tag When we want to insert a script into a web page, the standard way is to use the script ta ...
- jdk1.8环境变量配置
JAVA_HOME=/usr/java/jdk1.8.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOM ...
- Redis常用数据类型底层数据结构分析
Redis是一种键值(key-Value)数据库,相对于关系型数据库,它也被叫作非关系型数据库 Redis中,键的数据类型是字符串,但是为了非富数据存储方式,方便开发者使用,值的数据类型有很多 字符串 ...
- 在Windows QT下使用ZeroMQ
zeroMQ作为一个嵌入式消息队列系统,以其轻便灵活的使用方式,极为适合应用程序分布式通讯处理, 或者是一种有效的代替常规saocket通讯的方法. 1)下载地址:http://zeromq.org/ ...
- JavaScript实现页面滚动到div区域div以动画方式出现
用JavaScript实现页面滚动效果,以及用wow.js二种方式实现网页滚动效果 要实现效果是页面滚动到一块区域,该区域以动画方式出现. 这个效果需要二点: 一:我们要先写好一个css动画. 二:用 ...
- php curl方法 支持 http https get post cookie
//请求方式curl封装 @author Geyaru QQ 534208139 参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$coo ...
- JIRA7.13版本创建项目:工作流(二)
工作流 在上一篇文章中,我们新建了一个问题类型,并且增加到问题类型方案里了,同时又关联到我们的这个项目中.那么这些问题我们需要如何设置流程走向来表示问题的处理过程呢?这就需要设定一个流程,并将这个流程 ...
- echarts之bootstrap选项卡不能显示其他标签echarts图表
在echarts跟bootstrap选项卡整合的时候,默认第一个选中选项卡可以正常加载echarts图表,但是切换其他选项的时候不能渲染出其他选项卡echarts图表. 解决方法: 在js中添加代码: ...