目录
dick
dick dictionary 字典 特点: 根据关键字去获取内容 关键字不能重复 关键字必须是不可变的数据类型 定义dict的语法 定义dict:根据key去取value 字典中的元素必须具俩个部分key和value {元素一, 元素二, 元素三, ...}dict中也可含有多个元素,元素之间通过“,”隔开如何去访问一个字典 dict[key] 如何去修改 dict[key] = vaule->如果key不存在,就相当于添加了一个元素 如果key存在,就覆盖这个key所对应的值
list_data2 = {1: 2, 3: 4, 5: [1, 2, 3], 6: {2: [1, 2]}}
print(list_data2)
print(list_data2[6][2][1]) # 输出结果 2
定义一个dict
dict_data = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, False: True, (1, 2): (1, 2), [1, 2]: [1, 2], {1, 2}: {1: 2}}
print(dict_data)
发生报错
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
Traceback (most recent call last):
File "D:\python_code\dict.py", line 53, in <module>
dict_data = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, False: True, \
TypeError: unhashable type: 'list' 不可哈希类型:'list'
Process finished with exit code 1
'''
经过解读报错后,将字典中list元素所对应的key更改为一个int类型数据
dict_data2 = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, False: True, (1, 2): (1, 2), 9: [1, 2], {1: 2}: {1: 2}}
print(dict_data2)
依然会进行报错
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
Traceback (most recent call last):
File "D:\python_code\dict.py", line 67, in <module>
dict_data2 = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, False: True, (1, 2): (1, 2), 9: [1, 2], {1: 2}: {1: 2}}
TypeError: unhashable type: 'dict' 不可哈希类型:'dict'
Process finished with exit code 1
'''
经过解读报错后,将字典中dict元素所对应的key更改为一个int类型数据
dict_data2 = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, False: True, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}}
print(dict_data2)
输出结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: 1, 1.1: 1.1, (6+9j): (6+9j), '123': '123', b'456': b'456', None: None, False: True, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}
Process finished with exit code 0
'''
总结: 关键字必须是不可变的数据类型
dict_data2 = {1: 1, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, True: False, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}}
print(dict_data2, type(dict_data2))
dict_data3 = {True: False, 1.1: 1.1, 6+9j: 6+9j, "123": "123", b'456': b'456', None: None, 1: 1, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}}
print(dict_data3, type(dict_data3))
输出结果
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: False, 1.1: 1.1, (6+9j): (6+9j), '123': '123', b'456': b'456', None: None, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}} <class 'dict'>
{True: 1, 1.1: 1.1, (6+9j): (6+9j), '123': '123', b'456': b'456', None: None, (1, 2): (1, 2), 9: [1, 2], 10: {1: 2}} <class 'dict'>
Process finished with exit code 0
'''
输出第一个元素为1: False和True: 1的原因是,在python中True等于1
定义空字典
dict_data = {}
print(dict_data, type(dict_data))
dict_data1 = dict()
print(dict_data1, type(dict_data1))
类型转换
将tuple转换为dict
tuple_data = ((1, 2), (2, 3.3), ("hello", "word"), [b'123', b'abc'])
dict_data3 = dict(tuple_data)
print(dict_data3, type(dict_data3))
将list转换为dict
list_data = [(1, 2), (2, 3.3), ("hello", "word"), [b'123', b'abc']]
dict_data4 = dict(list_data)
print(dict_data4, type(dict_data4))
dict内置函数详解
1.clear
clear(...) 清除(...) D.clear() -> None. Remove all items from D. 清除() -> 无。 从D中清除所有项目
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
print(dict_data, type(dict_data))
dict_data.clear()
print(dict_data, type(dict_data))
输出结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7} <class 'dict'>
{} <class 'dict'>
Process finished with exit code 0
'''
总结:clear会清除原dict中所有元素,及不产生新的dict(该命令无返回值)
2. copy
copy(...) 拷贝 D.copy() -> a shallow copy of D 拷贝()-> 一个浅拷贝
dict_data = {1: 1, 2: 2, 3: {1: 1, 2: 2}}
shallow_data = dict_data.copy()
print(shallow_data)
from copy import deepcopy
deep_data = deepcopy(dict_data)
print(deep_data)
print(f"{'raw_id':^20}{'1st_id':^20}{'2nd_id':^20}{'3rd_id':^20}{'3-1_id':^20}{'3-1_id':^20}")
print(60*'——')
print(f"{id(dict_data):^20}{id(dict_data[1]):^20}{id(dict_data[2]):^20}{id(dict_data[3]):^20} \
{id(dict_data[3][1]):^20}{id(dict_data[3][2]):^20}")
print(60*'——')
print(f"{id(shallow_data):^20}{id(shallow_data[1]):^20}{id(shallow_data[2]):^20}{id(shallow_data[3]):^20} \
{id(shallow_data[3][1]):^20}{id(shallow_data[3][2]):^20}")
print(60*'——')
print(f"{id(deep_data):^20}{id(deep_data[1]):^20}{id(deep_data[2]):^20}{id(deep_data[3]):^20} \
{id(deep_data[3][1]):^20}{id(deep_data[3][2]):^20}")
输出结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: 1, 2: 2, 3: {1: 1, 2: 2}}
{1: 1, 2: 2, 3: {1: 1, 2: 2}}
raw_id 1st_id 2nd_id 3rd_id 3-1_id 3-1_id
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
2373522097216 2373520785648 2373520785680 2373522096960 2373520785648 2373520785680
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
2373522097024 2373520785648 2373520785680 2373522096960 2373520785648 2373520785680
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
2373522097344 2373520785648 2373520785680 2373522423296 2373520785648 2373520785680
Process finished with exit code 0
'''
原dict内元素发生改变浅拷贝产生的新dict也会发生改变,而深拷贝产生的dict不会改变。 浅拷贝:只复制元素一元素二以及元素三(字典地址)的地址,及只复制外层元素的地址。 深拷贝:将列表完整的复制一份,及外层元素内层元素的所有地址都给予复制 得出如图所示结果:
3. get
get(self, key, default=None, /) 获取(自身(可省略),key,默认值为无,/) Return the value for key if key is in the dictionary, else default. 如果key在字典中,则返回key的值,否则返回默认值
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
打印key=6对应值
print(dict_data.get(6)) # 返回值为 7
打印key=10对应值
print(dict_data.get(10)) # 返回值为 None
总结: 如果输入key值存在,那么返回key所对应的value 如果输入key值不存在那么返回None
4.items
items(...) 项目(...) 获取dict中所有key所对应的value
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
取出dict_data所对应的元素
for i in dict_data.items():
print(i)
取出dict_data1所对应的元素
dict_data1 = {1: 1, 2: 2, 3: {1: 1, 2: 2}}
for i in dict_data1.items():
print(i)
总结:一般itmes取出的值会以tuple形式存在 将下列dict的key与value分辨取出
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
for key, value in dict_data.items():
print(key, value)
dict_data1 = {1: 1, 2: 2, 3: {1: 1, 2: 2}}
print(40*"-")
for key, value in dict_data1.items():
print(key, value)
运行结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
1 2
2 3
3 4
4 5
5 6
6 7
----------------------------------------
1 1
2 2
3 {1: 1, 2: 2}
Process finished with exit code 0
'''
5.keys
keys(...) key 返回字典中所有的key
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
直接打印出dict中所有的key
print(dict_data.keys())
结果将以列表的形式返回
for i in dict_data.keys():
print(i)
运行结果;
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
1
2
3
4
5
6
Process finished with exit code 0
'''
6.values
values(...) 值(...) 返回字典中所存在的所有值
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
直接打印出dict中所有的value
print(dict_data.values())
结果将以列表的形式返回
for i in dict_data.values():
print(i)
运行结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
2
3
4
5
6
7
Process finished with exit code 0
'''
7.pop
pop(...) 移除/弹出(key) D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 删除指定的键并返回相应的值(删除指定的key和对应的值) If key is not found, default is returned if given, otherwise KeyError is raised 如果找不到键,则返回默认值如果给定,则引发 key错误
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
dict_data.pop(6)
print(dict_data)
dict_data.pop(3)
print(dict_data)
运行结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: 2, 2: 3, 3: 4, 4: 5, 5: 6}
{1: 2, 2: 3, 4: 5, 5: 6}
Process finished with exit code 0
'''
总结:该函数是在原dict上进行操作的因此会改变原有的dict。
8.popitem
popitem(self, /) 弹出项(自身(可省略),/) Remove and return a (key, value) pair as a 2-tuple. 移除并返回一个(键,值)对作为一个2元组(删除dict中的最后一对键和值。) Pairs are returned in LIFO (last-in, first-out) order. 对子按后进先出的顺序返回。 Raises KeyError if the dict is empty. 如果字典为空,则引发Key错误。
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
dict_data.popitem()
print(dict_data)
dict_data.popitem()
print(dict_data)
运行结果:
'''
D:\AXXZX\Python\python\python.exe D:\python_code\dict.py
{1: 2, 2: 3, 3: 4, 4: 5, 5: 6}
{1: 2, 2: 3, 3: 4, 4: 5}
Process finished with exit code 0
'''
9.setdefault
setdefault(self, key, default=None, /) 设置默认值(自身(可省略),键,默认值=无,/) Insert key with a value of default if key is not in the dictionary. 如果键不在字典中,则插入默认值的键。 Return the value for key if key is in the dictionary, else default. 如果key在字典中,则返回key的值,否则返回默认值。
dict_data = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
打印key=3对应值:
print(dict_data.setdefault(3))
打印key=10对应值:
print(dict_data.setdefault(10)) # 返回值为None
10.update
update(...) 更新(...) 字典更新,将字典dict2元素更新到dict1里 例:
dict_data1 = {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}
dict_data2 = {1: 1, 2: 2, 3: {1: 1, 2: 2}}
字典更新,将字典dict_data2元素更新到dict_data1 里
dict_data1.update(dict_data2)
print(dict_data1)
将dict_data4更新到dict_data3中
dict_data3 = {1: 2, 2: 3, 3: 4}
dict_data4 = {1: 3, 3: (1, 2)}
dict_data3.update(dict_data4)
print(dict_data3)
将dict_data6更新到dict_data5中
dict_data5 = {1: 2, 2: 3}
dict_data6 = {4: 5, 6: {1: 2, 3: 4}, (1, 2): [1, 3, (1, 2)]}
dict_data5.update(dict_data6)
print(dict_data5)
总结: 如果被更新的字典中己包含对应的键-值对,那么原键-值对会被覆盖, 如果被更新的字典中不包含对应的键-值对,则添加该键-值对。
课后扩展
获取一个list的下标与对应元素
list_data = [1, 1.1, 6+6j, True, None, 'abcd', b'abcd', (1, 2, 3, 4, 5), [1, 2.2, 'AAA'], {1: 2, 3: 4, 5: (1, 2) }]
for index, value in enumerate(list_data):
print(index, value)
输出结果
'''
D:\AXXZX\Python\python\python.exe D:\python_code\exercise.py
0 1
1 1.1
2 (6+6j)
3 True
4 None
5 abcd
6 b'abcd'
7 (1, 2, 3, 4, 5)
8 [1, 2.2, 'AAA']
9 {1: 2, 3: 4, 5: (1, 2)}
Process finished with exit code 0
'''