今天小张帮大家简单介绍下Python的一种数据结构: 字典,字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。
比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。
为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:
由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。
一.介绍
1.定义
dict(字典),以{}表示,每一项用逗号隔开, 内部元素用key:value的形式来保存数据,例如
{"jj":"林俊杰", "jay":"周杰伦"}
2.原理
-
查询的效率非常高, 通过 key 来查找元素 -
内部使用 key 来计算一个内存地址,采用 hash 算法,并且 key 必须是不可变的数据类型(即为可哈希的数据类型) -
dict 保存的数据不是按照我们添加进去的顺序保存的. 是按照 hash 表的顺序保存的.而 hash 表不是连续的. 所以没有索引,不能进行切片工作. 它只能通过 key 来获取 dict 中的数据.
dic = {} # 空字典
dic['徐峥'] = "人在囧途" #直接用key往里面存数据即可
print(dic["徐峥"]) # 最好别这么写,写成 print(dic.get("徐铮")),此时假入没有徐铮,程序也不会报错,会返回None
在这里顺便说下可哈希—-可哈希就是不可变
-
已知的可哈希(不可变)的数据类型: int, str, tuple, bool -
不可哈希(可变)的数据类型: list, dict, set 集合 此三类不能作为 key
二.字典的增、删、改、查
1. 字典的新增:
dic[新key] = "value" # 如果k存在,会替换原来的value
dic.setdefault("key","value") # 如果key存在,跳过,不存在,则添加
2. 删除
1.pop(key) #根据key删除
有返回值,可以写成
value=dic.pop(key)
print(value) # 打印删除的值,但是print(dic) 是整个键值对
2.popitem() # 不写 key 随机删除,(2.x是随机的删除,3.x是删除最后一个字典)
3.clear() # 清空
4.del dic[key] # 按照key删除
3. 修改
dic[key] = 新值 # key 为原来的
update() dic1.update(dic2) # 将字典2的内容放到1中,如果key1中存在,直接修改value,不存在的话附加到字典1 上
4. 查询
dic = {"徐锦江":"倩女幽魂","苏有朋":"倚天屠龙记"}
1. 用key直接查询
print(dic["徐锦江"]) #注意,key不存在会报错,此时可以用get,get有返回值
2. dic.get(key) #没有key返回None
print(dic.get("苏有朋")) # 倚天屠龙记
3. setdefault()
print(dic.setdefault("徐锦江")) #倩女幽魂
5. 其他操作
5.1 get 常用方法
dic={}
print(dic.get("name")) #None
print(dic.get("name","张三")) #张三(如果获取为None时,可以自定义默认值)
print(dic) #{}
dic2={"name":"李四"}
print(dic2.get("name","张三")) #李四(获取非None时,自定义值不起作用)
5.2 keys()、 values()、 items()的用法
例子:
dic = {"汪峰": "大陆音乐半壁江山", "周杰伦": "亚洲音乐天王", "罗志祥": "亚洲舞王"}
print( dic.keys())
print(dic.values())
print(dic.items())
结果如下:
dict_keys(['汪峰', '周杰伦', '罗志祥'])
dict_values(['大陆音乐半壁江山', '亚洲音乐天王', '亚洲舞王'])
dict_items([('汪峰', '大陆音乐半壁江山'), ('周杰伦', '亚洲音乐天王'), ('罗志祥', '亚洲舞王')])
可执行 这个返回的不是列表, 很像列表,一般不这么用,而是如下操作
- keys() 获取所有键
for el in dic:
print(el) # 直接拿到key value需要字典查一下
print(dic[el])
#两者用法一样
for key in dic.keys():
print(key) # 取出key
print(dic[key]) # 取出 value
- values()获取所有的值
for value in dic.values():
print(value) #取出value
- items() 获取所有的键值对. 返回的是元组
for item in dic.items():
print(item)
#结果
('汪峰', '大陆音乐半壁江山')
('周杰伦', '亚洲音乐天王')
('罗志祥', '亚洲舞王')
#如果都想拿到 根据解构的思路可以改写成
for k,v in dic.items():
print(k) # 取出key 汪峰
print(v) # 取出values 大陆音乐半壁江山
print(k,v) # 在一排显示 汪峰 大陆音乐半壁江山
5.3 fromkeys 是一个类方法.作用是创建新字典
fromkeys 是一个类方法.作用是创建新字典例
例子1:
d = {}
dd = d.fromkeys(["胡辣汤","are you 确定?"], "周芷若")
print(d) # 原字典没有改变 {}
print(dd) # 新的字典是通过第一个参数的迭代. 和第二个参数组合成key:value创建新字典 {'胡辣汤': '周芷若', 'are you 确定?': '周芷若'}
例子2:
d = dict.fromkeys(["哇哈哈", "爽歪歪"], []) # 所有的key用的都是同一个列表,改变其中一个。另一个也跟着改变
d["哇哈哈"].append("张无忌")
print(d) # {'哇哈哈': ['张无忌'], '爽歪歪': ['张无忌']}
三 小技巧,骚操作
1.合并字典。
-
方法 1 : 使用 update() 方法,第二个参数合并第一个参数
def Merge(dict1, dict2):
return(dict2.update(dict1))
# 两个字典
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
# 返回 None
print(Merge(dict1, dict2))
# dict2 合并了 dict1
print(dict2)
执行以上代码输出结果为:
None
{'d': 6, 'c': 4, 'a': 10, 'b': 8}
-
方法 2 : 使用 **,函数将参数以字典的形式导入
def Merge(dict1, dict2):
res = {**dict1, **dict2}
return res
# 两个字典
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
dict3 = Merge(dict1, dict2)
print(dict3)
执行以上代码输出结果为:
{'a': 10, 'b': 8, 'd': 6, 'c': 4}
2.列表内字典去重
列表的内的元素类型为字符串或这 int 类型的,借助集合 set,会很方便的去重,但是如果元素 dict,此时利用 set 去重将会报错TypeError: unhashable type: ‘dict’,以下介绍一个简单的方法,利用 reduce 简单说下 reduce reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
-
语法: reduce(function, iterable[, initializer]) -
参数 function — 函数,有两个参数 iterable — 可迭代对象 initializer — 可选,初始参数 -
返回值 返回函数计算结果 具体代码如下:
from functools import reduce
def list_dict_duplicate_removal():
data_list = [{"a": "123", "b": "321"}, {"a": "123", "b": "321"}, {"b": "321", "a": "123"},{"d":12,"sdf":2312}]
run_function = lambda x, y: x if y in x else x + [y]
return reduce(run_function, [[], ] + data_list)
if __name__ == '__main__':
print (list_dict_duplicate_removal())
#结果如下
[{'a': '123', 'b': '321'}, {'d': 12, 'sdf': 2312}]
转载请注明:XAMPP中文组官网 » 超全Python字典及基本操作