Python字典详解

字典介绍

Python中还有一个很重要的数据类型就是字典,其实集合的底层使用的也是字典。

Python字典区别于其他的'容器'类型(list、tuple、set)的是里面存放的数据都是有映射关系的数据。

比如有份用户信息等级的数据如下:

小宝:13850501856

小鹏:13900881234

小亮:13899006745

小音:15900671234

小伦:15899996789

这组数据可以看成两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。那怎么办呢?

Python 提供了字典,可以保存具有映射关系的数据,所以字典相当于保存了两组数据。其中一组数据是关键数据,被称为 key,里面的数据是不能重复的;另一组数据可通过 key 来访问,被称为 value,value是允许重复的。

形象地看,字典中 key 和 value 的关联关系如图所示:

Python字典详解_第1张图片

由于字典中的 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'}

字典操作

字典的操作我们跟前面介绍一样,也是使用增删改查的顺序介绍。在我们开始之前,我们先了解下字典元素的获取。

字典中不存在索引,那如何获取里面的数据呢?两种方式:

  1. 字典名[key]的方式获取

  2. 字典名.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()

  1. del 字典名[key] : 删除指定key的键值对

  2. 字典对象.pop(key) : 用于获取指定 key 对应的 value,并删除这个 key-value 对

  3. 字典对象.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

 

你可能感兴趣的:(宋宋讲编程,Python,数据分析,python,开发语言,numpy)