字典
字典是列表以外Python中使用最灵活的内置数据类型
字典是一种可变的数据据类型
和列表的区别:
- 列表有序,字典无序
- 列表通过索引(偏移)访问元素,字典通过键(key)访问元素
字典的基本格式:
dic = {key1:value1,key2:value2,...,keyn:valuen}
值可以取任意数据类型,但是键不可以,必须为不可变数据类型,即key必须克哈希。
(可哈希……不可变,不可哈希……可变)
info = {'id': 31602312, 'name': 'Tom', 'age': 18}
key:value #键值对
print(info)
特点:
- Key:value,键值对之间用冒号(:)连接
- Key:value 组成一个元素
- 键值对直接用逗号隔开
- 整个字典用花括号({})包裹
字典的创建
空字典
dic = {}
print(type(dic))
<class 'dict'>
创建多元素字典
info = {'id': 31602312, 'name': 'Tom', 'age': 18}
print(len(info))
3
不可通过位置索引,因为是无序的
info = {'id': 31602312, 'name': 'Tom', 'age': 18}
print(info[0])
报错
只能通过key索引
info = {'id': 31602312, 'name': 'Tom', 'age': 18}
print(info['id'])
31602312
key1, key2, key3 = 'id', 'name', 'age'
value1, value2, value3 = 31602312, 'tom', 18
print({key1: value1, key2: value2, key3: value3, })
{'id': 31602312, 'name': 'tom', 'age': 18}
强转
dic = dict(id=31602312, name='tom', age=18)
print(dic)
zip()
key = ('id', 'name', 'age')
value = (31602312, 'tom', 'age')
tp = tuple(zip(key, value))
print(tp, type(tp))
print((dict((('id', 31602312), ('name', 'tom'), ('age', 18)))))
{'id': 31602312, 'name': 'tom', 'age': 18}
(('id', 31602312), ('name', 'tom'), ('age', 'age')) <class 'tuple'>
{'id': 31602312, 'name': 'tom', 'age': 18}
字典强转其他的,只能输出键的值
key = ('id', 'name', 'age')
value = (31602312, 'tom', 'age')
tp = tuple(dict(zip(key, value)))
print(tp, type(tp))
('id', 'name', 'age') <class 'tuple'>
通过字典的fromkeys方法创建字典
格式:
dic = fromkeys(sep,val=none)
- 创建并返回一个字典
- 以sep中的元素作为该字典的键
- val的值作为该字典中所有键对应的初始值;如不提供,默认为none
fromkeys内置最多两个元素
dic = dict.fromkeys(['Tom', 'Jack', 'Lucy'], 666)
print(dic)
{'Tom': 666, 'Jack': 666, 'Lucy': 666}
字典的常见操作
增
- 直接添加键值对(dic[key] = value)
- 通过使用变量名[‘键’]=‘值’。
- 如果key不存在,新建键值对(key:value)
- 如果存在,则更新值(value)
- 通过使用变量名[‘键’]=‘值’。
dic = {}
print(dic)
dic['id']= 31602312
dic['name'] = 'Tom'
dic['age'] = 20
print(dic)
{}
{'id': 31602312, 'name': 'Tom', 'age': 20}
-
小练习
用input输入一个id,名字,年龄,创建一个字典,将输入的内容放在字典中,循环输出放进一个列表中,如:
a = [{'id': 31602312, 'name': 'Tom', 'age': 20}, {'id': 31602313, 'name': 'Lucy', 'age': 22}, ... ]
li = []
while True:
flag = input('是否继续:(y or n)')
if flag == 'n':
break
else:
dic = {}
id = int(input("请输入id:"))
name = input("请输入名字:")
age = int(input("请输入年龄:"))
dic['id'] = id
dic['name'] = name
dic['age'] = age
li.append(dic)
print(dic)
print(li)
是否继续:(y or n)y
请输入id:123
请输入名字:ss
请输入年龄:12
是否继续:(y or n)n
{'id': 123, 'name': 'ss', 'age': 12}
[{'id': 123, 'name': 'ss', 'age': 12}]
-
dict.update(dic)
把字典dic中的键值对(key:value)更新到dict中。
- 两个字典的键完全不同,则将dic的键值对全部添加到dict中
- 存在相同的键,则更新dict中对应的值
dic = {'name':'daming','hobby':'Read'} dict = {'id': 31602312, 'name': 'Tom', 'age': 18} dict.update(dic) print(dict) {'id': 31602312, 'name': 'daming', 'age': 18, 'hobby': 'Read'}
###删
- dict.pop()
- 格式:dict.pop(key) 删除key所对应的键值对
- 如果key存在dict中,删除并返回dict[key]
- 如果不存在,给出默认值并返回默认值,未给出默认值,报错
- 格式:dict.pop(key) 删除key所对应的键值对
dict = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict.pop('id')
print(dict)
print(dict.pop('age'))
print(dict.pop('name','dd'))
print(dict.pop('id','dd'))
{'name': 'Tom', 'age': 18}
18
Tom
dd
dict = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict.pop('name','dd')
print(dict)
{'id': 31602312, 'age': 18}
dict = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict.pop('ss','dd')
print(dict)
{'id': 31602312, 'name': 'Tom', 'age': 18}
-
dict.popitem()
随机返回并删除字典中的一对键和值(一般删除末尾对)。
如果字典已经为空,却调用了此方法,就报出KeyError异常。
有返回值的元组
dict = {'id': 31602312, 'name': 'Tom', 'age': 18} print(dict.popitem()) key,value = dict.popitem() print(dict) print(key,value) ('age', 18) {'id': 31602312, 'name': 'Tom'} age 18
-
del dict
-
dict = {'id': 31602312, 'name': 'Tom', 'age': 18} del dict['age'] print(dict) {'id': 31602312, 'name': 'Tom'}
将整个字典以及字典结构删除(释放其所占内存)彻底删除
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
del dict1
print(dict1)
报错
-
dict.clear() 将整个字典内容删除
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18} dict1.clear() print(dict1) {}
改
-
直接修改
若不存在此key值,默认添加键值对
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict1['id'] = 31602311
print(dict1)
{'id': 31602311, 'name': 'Tom', 'age': 18}
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict1['hoppy'] = 'eating'
print(dict1)
{'id': 31602312, 'name': 'Tom', 'age': 18, 'hoppy': 'eating'}
-
dict1.setdefault()
-
键存在,不改动,返回字典中的值
-
键不存在,在字典中添加相应的键值对,并返回对应的值
-
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18} dict1.setdefault('id', '31602311') print(dict1) {'id': 31602312, 'name': 'Tom', 'age': 18}
-
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
dict1.setdefault('hobby', 'eat')
print(dict1)
{'id': 31602312, 'name': 'Tom', 'age': 18, 'hobby': 'eat'}
查
-
字典值的访问
只能通过key访问value,不能通过索引位置访问
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
print(dict1['id'])
31602312
若键不存在,直接报错
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
print(dict1['job'])
报错
-
dict.get()访问valve
-
语法格式 dict.get(key[,default])
-
不能确定字典中是否存在某个键而又想对其进行操作,比如获取值(get方法)
-
当key不存在的时候,不会抛出异常,返回none
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18} print(dict1.get('id',31602333)) print(dict1.get('salary')) print(dict1) 31602312 None {'id': 31602312, 'name': 'Tom', 'age': 18}
-
遍历
- dict.keys() 返回key值
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
for key in dict1.keys():
print(key, end=' ')
id name age
- dict.values() 返回value值
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
for value in dict1.values():
print(value, end=' ')
31602312 Tom 18
- dict.items() 返回key:value值
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
for item in dict1.items():
print(item, end=' ')
('id', 31602312) ('name', 'Tom') ('age', 18)
dict1 = {'id': 31602312, 'name': 'Tom', 'age': 18}
for key, value in dict1.items():
print(key, ":", value)
id : 31602312
name : Tom
age : 18
-
小练习
将以下列表进行分类,返回到字典
li = [23, 34, 45, 56, 67, 33, 22, 54, 66, 87, 98, 21] # 返回 # {'>=60':[],'<60':[]}
li1 = []
li2 = []
for i in li:
if i >=60:
li1.append(i)
else:
li2.append(i)
dic = {'>=60':li1,'<60':li2}
print(dic)
{'>=60': [67, 66, 87, 98], '<60': [23, 34, 45, 56, 33, 22, 54, 21]}