python学习之数据类型(dic) 您所在的位置:网站首页 dic是什么公司 python学习之数据类型(dic)

python学习之数据类型(dic)

2023-11-26 09:16| 来源: 网络整理| 查看: 265

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': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁'], '英雄联盟': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁']}


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有