Python中还有一个很重要的数据类型就是字典,其实集合的底层使用的也是字典。
Python字典区别于其他的'容器'类型(list、tuple、set)的是里面存放的数据都是有映射关系的数据。
比如有份用户信息等级的数据如下:
小宝:13850501856
小鹏:13900881234
小亮:13899006745
小音:15900671234
小伦:15899996789
这组数据可以看成两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。那怎么办呢?
Python 提供了字典,可以保存具有映射关系的数据,所以字典相当于保存了两组数据。其中一组数据是关键数据,被称为 key,里面的数据是不能重复的;另一组数据可通过 key 来访问,被称为 value,value是允许重复的。
形象地看,字典中 key 和 value 的关联关系如图所示:
由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。
如何声明一个字典呢?我们使用的是: 花括号或者大括号 即{}. 下面是一个空字典的声明
dict1 = {}
print(type(dict1))
结果:
有映射关系的字典声明方式:
dict1 = {'小宝':'13850501856','小鹏':'13900881234'}
print(dict1)
dict 是一种类型,它就是 指Python 中的字典类型,在使用花括号语法创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开,如果有多个 key-value 对之间用英文逗号隔开.
字典中的键key是不允许重复的,如果里面有重复的,后面的默认覆盖前面的。
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小宝':'13850508000'}
print(dict1)
结果:
{'小宝': '13850508000', '小鹏': '13900881234'}
但是如果值有重复的是没有关系的。
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13900881234'}
print(dict1)
结果:
{'小宝': '13850501856', '小鹏': '13900881234', '小亮': '13900881234'}
字典的操作我们跟前面介绍一样,也是使用增删改查的顺序介绍。在我们开始之前,我们先了解下字典元素的获取。
字典中不存在索引,那如何获取里面的数据呢?两种方式:
字典名[key]的方式获取
字典名.get(key,defaultvalue)的方式获取
# 字典
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
print(dict1['小亮'])
print(dict1['小伦'])
或者使用
print(dict1.get(''小亮''))
print(dict1.get('小伦'))
允许发现结果是相同的,但是有什么区别呢?区别就是如果key在字典中不存在的情况下。第一种方式报错,第二种方式不报错,而且还可以设置默认值
# print(dict1['小飞']) 报错的
print(dict1.get('小飞'))
print(dict1.get('小飞','不存在此数据')) #
get方法的第一个参数是key,第二个参数是默认值,即没有找到对应的key,显示的内容。
添加与修改元素
刚才在里面没有发现小飞,我们如何将小飞的信息加到字典里面呢?添加的方式:
字典名[key] = 新值
上面这个用法对字典会产生两种影响,一种是添加一个键值对,一种是修改里面的一个键值对的值。
判断是哪一种,关键点是看key在字典中是否存在。如果key没有在字典中存在则添加一个键值对,否则如果存在则修改一个键值对。
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
print(len(dict1)) # 打印长度为5
dict1['小飞'] = '18912346666'
print(dict1) # 添加了一个键值对
print(len(dict1)) # 打印长度发现变成了6
# 如果key是小音呢?
dict1['小音'] = '13918185656'
print(dict1) # 发现小音原来的手机号码发生了改变,变成了刚才的13918185656
有类似用法的还有:
setdefault(key, value): 该方法总能返回指定 key 对应的 value;但是如果该 key-value 对不存在,则先为该 key 设置默认的 value,然后再返回该 key 对应的 value,存在则直接返回key对应的value值
update(dict参数):可使用一个字典所包含的 key-value 对来更新己有的字典。在执行 update() 方法时,如果被更新的字典中己包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去。没有返回值。
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
print(len(dict1)) # 打印长度为5
result1 = dict1.setdefault('小飞','18912346666')
print(dict1)
print(result1)
result2 = dict1.update({'小战':'18912346666'})
print(dict1)
print(result2)
结果:
{'小宝': '13850501856', '小鹏': '13900881234', '小亮': '13899006745', '小音': '15900671234', '小伦': '15899996789', '小飞': '18912346666'}
18912346666
{'小宝': '13850501856', '小鹏': '13900881234', '小亮': '13899006745', '小音': '15900671234', '小伦': '15899996789', '小飞': '18912346666', '小战': '18912346666'}
None
添加或者修改元素使用较多的还是上面的那两种,下面的setdefault和update了解即可。
删除元素
元素删除方法也有多种,比如使用del、pop()、popitem()
del 字典名[key] : 删除指定key的键值对
字典对象.pop(key) : 用于获取指定 key 对应的 value,并删除这个 key-value 对
字典对象.popitem() : popitem() 方法用于随机弹出字典中的一个 key-value 对。
dict1 = {'小宝': '13850501856', '小鹏': '13900881234', '小亮': '13899006745', '小音': '15900671234', '小伦': '15899996789', '小飞': '18912346666', '小战': '18912346666'}
print(len(dict1)) # 打印长度为7
del dict1['小战']
print(len(dict1)) # 打印长度为6
dict1.pop('小宝')
print(len(dict1)) # 打印长度为5
dict1.popitem()
print(len(dict1)) # 打印长度为4
均可以实现元素的删除,其实第一种和第二种是类似的,就看是否想获取被删除的元素了。
如果全部都不想要可以使用clear(),即字典对象.clear()
查找元素
查找元素仍然是使用关键字in,但是如果直接用在字典上只能判断值是否存在与字典中。如果要判断值是否存在就要借助values()方法。
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
print(len(dict1)) # 打印长度为5
if '小宝' in dict1:
print('小宝在啊!')
else:
print('怎么小宝丢了啊?')
但是不能判断手机号码是否存在?此时借助values()
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
print(len(dict1)) # 打印长度为5
if '13850501856' in dict1.values():
print('嘻嘻!有这个号码太好了')
else:
print('呜呜~~没有找到这个号码呢')
values()表示获取字典中的所有值。当然也可以把字典中的值通过for循环打印出来
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
for value in dict1.values():
print(value)
字典中除了有获取所有值的方法values(),还有获取键的keys(),还有获取键值对的items()
dict1 = {'小宝':'13850501856','小鹏':'13900881234','小亮':'13899006745','小音':'15900671234','小伦':'15899996789'}
# 遍历打印所有的key
for key in dict1.keys():
print(key)
# 遍历打印所有的键值对
for key,value in dict1.items():
print(key,value)
打印结果:
小宝
小鹏
小亮
小音
小伦
小宝 13850501856
小鹏 13900881234
小亮 13899006745
小音 15900671234
小伦 15899996789
通过字典我们可以完成一个图书管理系统。代码如下
library = [
{'bookname': '西游记', 'author': '吴承恩', 'price': 100, 'number': 40},
{'bookname': '水浒传', 'author': '施耐庵', 'price': 100, 'number': 40},
{'bookname': '红楼梦', 'author': '曹雪芹', 'price': 100, 'number': 40},
{'bookname': '天珠变', 'author': '唐三少', 'price': 100, 'number': 40},
{'bookname': '西游记', 'author': '吴成恩', 'price': 100, 'number': 40}
]
while True:
oper = input('\n1. 借书 \n2. 还书\n3. 查询\n4. 查看所有\n5. 退出\n请选择你需要的服务:')
if oper == '1':
print('1.借书模块')
# 输入书名 --->
bookname = input('请输入书名:')
for book in library:
if bookname in book.values():
if book['number']>0:
book['number']-=1
print('借书成功!')
else:
print('库存不足')
break
else:
print('没有这本书呢!')
elif oper == '2':
print('2.还书模块')
bookname = input('请输入书名:')
for book in library:
if bookname in book.values():
book['number']+=1
print('还书成功!')
break
else:
print('没有这本书呢!')
elif oper == '3':
print('3.查询模块(书名/作者)')
message = input('请输入书名/作者名:')
for book in library:
if message in book.values():
print('有这本书哦!可以借阅的')
break
else:
print('没有这本书或者用户名')
elif oper == '4':
print('4.查看所有模块')
for book in library:
print(f"图书名:{book['bookname']},作者:{book['author']},价格:{book['price']},库存剩余{book['number']}")
elif oper == '5':
print('5.退出')
print('系统正常退出')
break
else:
print('请从新选择')
-END-
扫码添加请备注:python,进群与宋老师面对面交流:517745409