? 字典(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中的数据
常规: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)
dic.popitem() #随即删除
dic.pop(‘Key‘) #定向删除
del dic[Key] #del删
dic.clear() #清空
注意:当字典在迭代过程中,是不能进行删除操作的,因为迭代是无序的。
修改
dic[‘Key‘] = 新的value
dic.update(dic2) #dic2中的Key与dic里的key一致时,替换value;如果dic2中的key不存在dic中,则在dic中新增该键值对;如果dic中有dic2没有的Key则该键值对保持不变。
查询
print( dic[key] ) #key不存在时会报错
print( dic.get(key,key不存在时返回的内容) #key不存在时返回None,该返回值可自定义
setdefault() ##1.新增(先看有没有Key,如果有直接进行查询;如果没有,则新增然后查询返回value) 2.根据key把value值返回
###字典的遍历
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.keys()) #因列表的形式输出
for key in dic.keys():
print(key) #拿到key
print(dic[key]) #拿到value,实现对value的遍历
注意:通过key可以找到value但是通过value找不到key!!
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.values()) #通过value是拿不到Key的
for value in dic.values(): #只能遍历value
print(value)
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
print(dic.items())
for item in dic.items():
print(item) #输出的是元组
print(item[0],item[1])
首先,介绍一个解包小知识,解包时前边变量的个数必须与后边解包的个数必须一致
a,b = (10,20) #解构,解包,元组、列表都具有该功能
print(a)
print(b)
###前边变量的个数必须与后边解包的个数必须一致
实现:当需要遍历字典,在操作中涉及到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)
因为字典本身就是一个可迭代的对象,可以直接进行for循环
#先看一下如果直接对字典进行迭代的话会是什么情况
dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
for el in dic:
print(el) #直接输出的只有Key,那么是不是可以用key把value给印出来呢?
print(dic[el]) #答案是可以的
在写字典嵌套时,一点更要注意元素与元素之间不要忘记加逗号。
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']['总管'] )
原文:https://www.cnblogs.com/jjzz1234/p/10991474.html