4. 基本数据结构-字典
一、字典定义
字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。键必须唯一,值则不必;值可以取任何数据类型,但键必须是不可变数据类型,如:字符串,整型,元组。字典查询效率高,内部使用key来计算一个内存地址(hash)
二、字典操作
1. 添加
# 创建空字典
dict_test = {}
dict_test = dict()
dict_test["language"] = "Chinese"
>>> dict_test
{'language': 'Chinese'}
# setdefualt() - 默认:None
dict_test.setdefault("age")
>>>{'language': 'Chinese', 'age': None}
dict_test.setdefault("name", "WeChat")
>>>{'language': 'Chinese', 'age': None, 'name': 'WeChat'}
2. 修改
dict_test = {'language': 'Chinese', 'age': None, 'name': 'WeChat'}
dict_test["age"] = 18
>>>{'language': 'Chinese', 'age': 18, 'name': 'WeChat'}
# update() - 相当于合并两个dict
dict_one = {"name":"tree", "age":100, "height":"90M"}
dict_two = {"name":"tree", "color":"green"}
dict_one.update(dict_two)
>>>dict_one
{'name': 'tree', 'age': 100, 'height': '90M', 'color': 'green'}
3. 查询
dict_test = {'language': 'Chinese', 'age': 10, 'name': 'WeChat'}
(1) 直接key取 - 当key不存在时,KeyError
dict_test["age1"]
(2) get() 方法
dict_test.get("name")
dict_test.get("name_new") ->没有key,返回None
dict_test.get("name_new", "不存在") ->没有key,指定返回值
(3) setdefault()
-新增:先看看有没有key,有就返回其值;没有,执行新增
dict_test.setdefault("name", "QQ")
>>>name在dict_test中则返回对应的值,不在则返回QQ
4. 删除
dict_test = {'language': 'Chinese', 'age': 10, 'name': 'WeChat'}
(1) dict_test.pop("age") ->pop指定key删,有返回值
>>>{'language': 'Chinese', 'name': 'WeChat'}
(2) dict_test.popitem() ->随机删除
(3) del dict_test["name"]
(4) dict_test.clear() ->清空
三、字典方法
1. items()
# 这个类型就是dict_items类型,可迭代的
item = dic.items()
print(item,type(item))
>>>dict_items([('name', 'jin'), ('sex', 'male'), ('age', 18)]) <class 'dict_items'>
2. keys()
keys = dic.keys()
print(keys,type(keys))
>>>dict_keys(['sex', 'age', 'name']) <class 'dict_keys'>
3. values()
values = dic.values()
print(values,type(values))
>>>dict_values(['male', 18, 'jin']) <class 'dict_values'> 同上
4. 迭代
1. 默认循环字典键key
for key in dic:
print(key)
2. 循环字典键key
for key in dic.keys():
print(key)
3. 循环字典中的值
for value in dic.values():
print(value)
4. 循环字典中的键值对
for key, value in dic.items( ):
print(key, value)
len() 计算键值对的个数
四、字典循环删除
1. 删除数字小于100的人
dic = {'alex':100, 'wusir':20000, 'jack':12, 'tony':1, 'ketty': 3000}
# 先创建一个新列表存储要删的人
li = []
# 循环字典中的键值对
for key, value in dic.items():
# 小于100的人添加进列表
if value < 100:
li.append(key)
# 循环列表中的元素,删除字典中的键
for el in li:
del dic[el]
print(dic)
结果:
{'alex': 100, 'wusir': 20000, 'ketty': 3000}
五、fromkeys()
1. 不是改变字典,是一个类方法,作用是创建新字典
dic = {}
dic_new = dic.fromkeys("abc", "hello")
print(dic) # {}
print(dic_new) # {'a': 'hello', 'b': 'hello', 'c': 'hello'}
2. 新字典是通过第一个参数的迭代和第二个参数组成键值对创建新字典。fromkeys( )正常来说是类名来访问的
dic1 = dic.fromkeys(['a', 'b'], [])
dic1['a'].append('alex')
# key使用的同一值
>>>{'a':['alex'], 'b':['alex']}
1、 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
2、 键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行
3、不可变数据(不可hash)(3 个):Number(数字)、String(字符串)、Tuple(元组);
4、可变数据(可hash)(3 个):List(列表)、Dictionary(字典)、Set(集合)。
六、实例
有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
1. 方法一
li= [11,22,33,44,55,66,77,88,99,90]
result = {}
for el in li:
if el < 66:
# setdefault可以帮我们执行新增, 如果key存在了就不新增了
# {'key1':[11,22]}
result.setdefault("key1", []).append(el)
else:
result.setdefault("key2", []).append(el)
2. 方法二
li= [11,22,33,44,55,66,77,88,99,90]
result = {}
for el in li:
if el < 66: # 11, 22
if result.get("key1") == None:
result["key1"] = [el] # 11
else:
result['key1'].append(el)
else:
if result.get("key2") == None:
result["key2"] = [el] # 11
else:
result['key2'].append(el)