七、字典(dict)
1、字典的简单介绍
字典(dict)是Python中唯⼀的⼀个映射类型.他是以{ }括起来的键值对组成. 在dict中key是
唯⼀的. 在保存的时候, 根据key来计算出⼀个内存地址. 然后将key-value保存在这个地址中.
这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key’必须是可hash的。
可hash的数据类型:int,str,bool,tuple
不可hash的数据类型:list,dict,set
语法:{key: value, key2: value2 …}
注意: key必须是可哈希(不可变类型)的. value没有要求.可以保存任意类型的数据
# 以下为正确字典格式
dic = {1: 123, "name": "oldniu", False: True, (1, 2, 3): (11, 22, 33)}
print(dic[1])
print(dic["name"])
print(dic[False])
print(dic[(1, 2, 3)])
# 以下是不正确的字典格式
dic = {[1, 2]: "我咋就不合法呢"} # TypeError: unhashable type: 'list'
dic = {{"name": "dogfa"}: "兄嘚我也是不合法的"} # TypeError: unhashable type: 'dict'
dic = {{"age", "hobby"}: "想不到吧,我也是不合法的"} # TypeError: unhashable type: 'set'
注意:dict保存的数据不是按照我们添加进去的顺序保存的. 是按照hash表的顺序保存的. ⽽hash表
不是连续的. 所以不能进⾏切片⼯作. 它只能通过key来获取dict中的数据
2、字典的其它相关操作
增
--------------------------------------------------------------------
注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687
--------------------------------------------------------------------
dic = {"age": 18}
dic["name"] = "李白"
print(dic) # {"name": "李白", "age": 18}
dic["age"] = 20
print(dic) # {"name": "李白", "age": 20}
# 如果key不存在,则是执行添加操作,如果key存在,则是执行修改操作
dic = {"age": 18}
print(dic.setdefault("name", "杜甫")) # 杜甫
print(dic) # {"age": 18, "name": "杜甫"}
print(dic.setdefault("age", 20)) # 18
print(dic) # {"age": 18, "name": "杜甫"}
# setdefault()的第一个参数为key,第二个参数为value。如果key不存在,则执行添加操作并返回对应的value,如果key存在,则执行查询操作返回字典中对应的key的
删
dic = {"name": "Jack Ma", "age": 38, "gender": "man"}
print(dic.pop("name")) # Jack Ma
print(dic) # {"age": 38, "gender": "man"}
# 因为dict在存储时不是连续的,所以pop在删除时不能指定索引,须指定key进行删除并会返回当前值。
dic = {"name": "Jack Ma", "age": 38, "gender": "man"}
del dic["name"]
print(dic) # {"age": 38, "gender": "man"}
dic.popitem() # 随机删除
dic.clear() # 清空字典
改
dic = {"name": "Jack Ma", "age": 38, "gender": "man"}
print(dic.pop("name")) # Jack Ma
print(dic) # {"age": 38, "gender": "man"}
# 因为dict在存储时不是连续的,所以pop在删除时不能指定索引,须指定key进行删除并会返回当前值。
dic = {"name": "Jack Ma", "age": 38, "gender": "man"}
del dic["name"]
print(dic) # {"age": 38, "gender": "man"}
dic.popitem() # 随机删除
dic.clear() # 清空字典
改
dic1 = {"id": 1, "name": "马云", "salary": 100000000}
dic2 = {"age": 38, "name": "马化腾"}
dic1.update(dic2) # 将dict2中的内容更新值dict1中,如果key存在则覆盖,key不存在则添加
print(dic1) # {'id': 1, 'name': '马化腾', 'salary': 100000000, 'age': 38}
print(dic2) # {'age': 38, 'name': '马化腾'}
查
dic = {"id": 1, "name": "电视机", "price": 1000}
print(dic["price"]) # 1000
print(dic["age"]) # 报错
print(dic.get("name")) # 电视机
print(dic.get("age")) # None
print(dic.get("age", 20)) # 20
# 当直接对字典通过key取值时,如果存在key,可以取出对应的值,如果不存在key,则会报错。所以建议使用get()方法,当key不存在时,它会返回一个None,你也可以在下一个参数指定key不存在时的返回值。
print(dic.setdefault("name")) # 电视机
其它相关操作
dic = {"id": 1, "fruit": "apple", "price": 10}
print(dic.keys()) # dict_keys(['id', 'fruit', 'price'])
for key in dic.keys():
print(key)
print(dic.values()) # dict_values([1, 'apple', 10])
for value in dic.values():
print(value)
# dic.keys()和dic.values()得到的值和列表很像,但是不是列表,但可以当做列表来进行for循环使用。
for i in dic:
print(i,dic[i])
# id 1
==> # fruit apple
# price 10
# 当对字典进行for循环时,得到的元素是key。
print(dic.items()) # dict_items([('id', 1), ('fruit', 'apple'), ('price', 10)])
for k,v in dic.items():
print(k,v)
# id 1
==> # fruit apple
# price 10
# dic.items()得到的是类似列表里面嵌套元祖的格式,对dic.items()进行for循环时,得到了里面的元祖。
# 由于 a, b = (1, 2)可以推出 k, v = ("id", 1),所以k,v 分别对应字典中的key和value。
字典的嵌套
dic = {
"id": 9527,
"name": "周星星",
"age": 40,
"movies": ["功夫", "少林足球", "算死草", "逃学威龙"],
"partner": {
"name": "逼王达",
"age": 45,
"children": ["老大", "老二", "老三"]
},
"desc": "别人笑我太疯癫,我笑他人看不穿"
}
# 获取"别人笑我太疯癫,我笑他人看不穿"
print(dic["desc"])
# 获取周星星的合作伙伴名字
print(dic.get("partner").get("name"))
# 获取“逃学威龙”
print(dic.get("movies")[3])
# 获取逼王达的第二个孩子名字
print(dic.get("partner").get("children")[1])
字典中的fromkeys()(注意)
dic = dict.fromkeys(["dogfa", "oldniu"], (1, 2))
print(dic) # {"dogfa": (1, 2), "oldniu": (1, 2)}
# fromkeys()用于重新生成一个新的字典,第一个参数中的每一项都会作为新的字典的key,第二个参数作为value。
dic = dict.fromkeys(["dogfa", "oldniu"], [1, 2])
dic.get("dogfa").append(3)
print(dic) # {"dogfa": [1, 2, 3], "oldniu": [1, 2, 3]}
八、集合(set)
set集合是python的⼀个基本数据类型. ⼀般不是很常⽤. set中的元素是不重复的.⽆序的.⾥
⾯的元素必须是可hash的(int, str, tuple,bool), 我们可以这样认为, set就是dict类型的数据但
是不保存value, 只保存key. set也⽤{}表⽰。
注意:set中的元素必须是可hash的,但是set本身不是可hash的,set是可变类型数据。
set = {1, "2", True, [1, 2]} # TypeError: unhashable type: 'list'
set = {1, "2", True, {1: 2}} # TypeError: unhashable type: 'dict'
set = {1, "2", True, {1, 2}} # TypeError: unhashable type: 'set'
由于set中的元素是不重复的,无序的,所以我们可以利用这个特性对列表进行去重操作。
lst = ["哈哈哈", 1, "嘿嘿嘿", "哈哈哈", "dsb", True, 1]
print(list(set(lst))) # [1, 'dsb', '嘿嘿嘿', '哈哈哈']
set的相关操作
增
s = {1, 2, 3}
s.add(4)
print(s) # {1, 2, 3, 4}
s = {1, 2, 3}
s.update([4, 5, 6]) # 迭代更新
print(s) # {1, 2, 3, 4, 5, 6}
# 已存在的元素将不会被添加进去
删
s = {1, 2, 3}
s1 =s.pop() # 随机删除
print(s) # {2, 3}
print(s1) # 1
s = {1, 2, 3}
s.remove(2)
print(s) # {1, 3}
# 对不存在的元素进行删除时将会报错
s = {1, 2, 3}
s.clear()
print(s) # set()
# 清空之后打印输出的是set(),是为了和dict区分开
改
# 由于集合是没有索引,无序的,所以我们对几个进行删除时不能通过索引的方式来删除
# 修改方法1:首先通过remove()删掉需要修改的的元素,然后add()添加新元素。
s = {1, 2, 3} # 将1改成10
s.remove(1)
s.add(10)
print(s) # {10, 2, 3}
# 修改方法2:将集合通过list()转换成列表,再通过对列表进行修改操作。
查
for i in s:
print(i)
其它常用操作
# 求两个集合中的交集
s1 = {"狗法", "oldniu", "djb"}
s2 = {"狗法", "oldniu", "djb", "dsb"}
print(s1.intersection(s2)) # {"狗法", "oldniu", "djb"}
print(s1 & s2) # {"狗法", "oldniu", "djb"}
# 求两个集合中的并集
s1 = {"狗法", "oldniu", "djb"}
s2 = {"狗法", "oldniu", "djb", "dsb"}
print(s1.union(s2)) # {"狗法", "oldniu", "djb", "dsb"}
print(s1 | s2) # {"狗法", "oldniu", "djb", "dsb"}