閑人壹のPython笔记.2021.08.07 · 2021年8月8日 更新完成

字典(dictionary)

字典 是无序的可变序列,保存的内容是以 “键(key)、值(value)” 对应的形式存放。键 是唯一的,值可以有多个。字典可以很方便的定义一个包含多个命名字段的对象。

字典的主要特征:

  • 通过键而不是通过索引来读取;
  • 字典是任意对象的无序集合;
  • 字典是可变的,并且可以任意嵌套;
  • 字典中的键必须是唯一的;
  • 字典中的键必须不可变。

1.字典的创建和删除

  1. 创建字典时,键 和 值 之间使用冒号分隔,相邻的元素用逗号风分隔,所有元素放在一对 “{}” 中括号中。语法如下:

    字典名 = {1:1,2:2,3:3,……,键n:值n}
    字典名 = {}	# 空字典
    

    实例:

    zidian = {'QQ':12345,'MSN':67890,'Wx':34567}
    print(zidian,type(zidian))
    print('zidian 数据类型为:',type(zidian))
    

    输出结果:

    {'QQ': 12345, 'MSN': 67890, 'Wx': 34567} <class 'dict'>
    zidian 数据类型为: <class 'dict'>
    
  2. 通过映射函数创建字典

    语法:

    字典名 = dict(zip(列表1,列表2))
    

    相关函数:

    • dict() 函数用于创建一个字典。

      语法:

      class dict(**kwarg)
      class dict(mapping, **kwarg)
      class dict(iterable, **kwarg)
      

      参数说明:

      • **kwargs – 关键字
      • mapping – 元素的容器。
      • iterable – 可迭代对象。
    • zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

      语法:

      zip([iterable, ...])
      

      参数说明:

      • iterabl – 一个或多个迭代器;

    实例:

    lie1 = ['QQ','MSN','Wx']
    lie2 = [12345,67890,34567]
    zi = dict(zip(lie1,lie2))
    print('得到的字典 zi:',zi)
    print('zi 的数据类型:',type(zi))
    

    输出结果:

    得到的字典 zi: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
    zi 的数据类型: <class 'dict'>
    
  3. 通过给定的 “键 - 值” 创建字典

    语法:

    字典名 = dict(1=1,2=2,3=3,……,键n=值n)
    

    实例:

    zi = dict(QQ=12345,MSN=67890,Wx=34567)
    print(zi)
    

    输出结果:

    {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
    
  4. 使用 dict 对象的 fromkeys() 方法创建值为空的字典

    语法:

    字典名 = dict.fromkeys(列表)
    

    实例:

    lie = ['QQ','MSN','Wx']
    zi = dict.fromkeys(lie)
    print ('值为空的字典:',zi)
    

    输出结果:

    值为空的字典: {'QQ': None, 'MSN': None, 'Wx': None}
    

    函数说明:

    fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。

    语法:

    dict.fromkeys(seq[, value])
    

    参数

    • seq – 字典键值列表。
    • value – 可选参数, 设置键序列(seq)的值。
  5. 通过已创建的元组和列表创建字典

    lie1 = ('QQ','MSN','Wx')
    lie2 = [12345,67890,34567]
    zi = {lie1:lie2}
    print ('通过已创建的元组和列表创建的字典:',zi)
    

    输出结果:

    通过已创建的元组和列表创建的字典: {('QQ', 'MSN', 'Wx'): [12345, 67890, 34567]}
    

    注意:通过已创建的元组和列表创建字典时,键必须时元组,列表无法作为键使用。

  6. 删除字典

    lie1 = ('QQ','MSN','Wx')
    lie2 = [12345,67890,34567]
    zi = {lie1:lie2}
    print ('通过已创建的元组和列表创建的字典:',zi)
    zi.clear()
    print ('clear() 清空的字典:',zi)
    del zi
    print ('del 清空的字典:',zi)
    

    输出结果:

    通过已创建的元组和列表创建的字典: {('QQ', 'MSN', 'Wx'): [12345, 67890, 34567]}
    clear()清空的字典: {}
    Traceback (most recent call last):
      File "****.py", line 27, in <module>
        print ('del 清空的字典:',zi)
    NameError: name 'zi' is not defined
    

    函数说明:

    clear() 函数用于删除字典内所有元素。

    语法:

    字典名.clear()
    

    pop() 方法

    pop() 方法删除字典给定键 key 及对应的值,返回值为被删除的值。key 值必须给出。 否则,返回 default 值。

    语法:

    pop(key[,default])
    

    参数:

    • key: 要删除的键值
    • default: 如果没有 key,返回 default 值

    实例:

    zi = {'QQ':12345,'MSN':67890,'Wx':34567}
    print ('显示字典:',zi)
    qq = zi.pop('QQ')
    print (qq)
    print ('显示字典:',zi)
    

    输出结果:

    显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
    12345
    显示字典: {'MSN': 67890, 'Wx': 34567}
    

    popitem() 方法

    popitem() 方法随机返回并删除字典中的最后一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。

    语法:

    popitem()
    

    实例:

    zi = {'QQ':12345,'MSN':67890,'Wx':34567}
    print ('显示字典:',zi)
    zi.popitem()
    print ('再次显示字典:',zi)
    

    输出结果:

    显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
    再次显示字典: {'QQ': 12345, 'MSN': 67890}
    

2.通过 键 - 值对 访问字典

  1. 访问字典可以通过下标 键 的值实现,或者使用 get() 方法,注意字典和元组、列表的不同,通过索引是无法访问字典的。

    实例:

    zi = {'QQ':12345,'MSN':67890,'Wx':34567}
    print ('显示字典:',zi)
    print('字典内QQ号为:',zi['QQ'])		# 通过下标 [key]访问字典元素
    print('字典内MSN号为:',zi.get('MSN'))		# 通过 get() 方法访问字典元素
    print('字典内MSN号为:',zi.get('Wx','就不告诉你'))		# 通过 get() 方法访问字典元素
    print('字典内YY号为:',zi.get('YY'))
    print('字典内YY号为:',zi.get('YY','你来猜啊'))
    print('字典中的YY号:',zi['YY'] if 'YY' in zi else '没有录入此内容')		# 通过 if 语句判断字典中是否存在查询键值
    

    输出结果:

    显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
    字典内QQ号为: 12345
    字典内MSN号为: 67890
    字典内MSN号为: 34567
    字典内YY号为: None
    字典内YY号为: 你来猜啊
    字典中的YY号: 没有录入此内容
    

    函数说明:

    get() 函数返回指定键的值。

    语法

    get()方法语法:

    dict.get(key, default=None)
    

    参数

    • key – 字典中要查找的键。
    • default – 如果指定键的值不存在时,返回该默认值。

3.遍历字典

  1. 遍历字典是通过字典的 items() 方法实现

    items() 方法以列表返回视图对象,是一个可遍历的key/value 对。

    dict.keys()、dict.values() 和 dict.items() 返回的都是视图对象( view objects),提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。

    视图对象不是列表,不支持索引,可以使用 list() 来转换为列表。

    我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的。

    语法:

    dict.items()
    

    实例:

    zi = {'QQ':12345,'MSN':67890,'Wx':34567}
    print("获得字典中每一个键 - 值的元组列表:")
    for i in zi.items():
        print(i)
    print("获得字典中具体的每一个键和值:")
    for k,v in zi.items():
        print('key = ',k,',','values = ',v)
    

    输出结果:

    D:\Python39\python.exe "E:/BaiduNetdiskWorkspace/Python の/练习簿/字典练习.py"
    获得字典中每一个键 - 值的元组列表:
    ('QQ', 12345)
    ('MSN', 67890)
    ('Wx', 34567)
    获得字典中具体的每一个键和值:
    key =  QQ , values =  12345
    key =  MSN , values =  67890
    key =  Wx , values =  34567
    

4.添加、修改和删除字典元素

实例说明一切:

zi = {'QQ':12345,'MSN':67890,'Wx':34567}
print ('显示字典:',zi)
zi['YY'] = 10100					# 向字典中添加 'YY':10100
print ('示修改后的字典1:',zi)
zi['QQ'] = 54321					# 将 'QQ' 的值改为:54321
print ('再显示修改后的字典2:',zi)
del zi['QQ']						# 直接删除 键 - 值 'QQ':54321
print ('显示修改后的字典3:',zi)
if 'YY' in zi:						# 如何字典中存在 'YY' 就删除 'MSN'
    del zi['MSN']
print ('显示修改后的字典4:',zi)
if 'MSN' in zi:						# 如何字典中存在 'MSN' 就删除 'YY'
    del zi['YY']
print ('显示修改后的字典5:',zi)

输出结果:

显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
示修改后的字典1{'QQ': 12345, 'MSN': 67890, 'Wx': 34567, 'YY': 10100}
再显示修改后的字典2{'QQ': 54321, 'MSN': 67890, 'Wx': 34567, 'YY': 10100}
显示修改后的字典3{'MSN': 67890, 'Wx': 34567, 'YY': 10100}
显示修改后的字典4{'Wx': 34567, 'YY': 10100}
显示修改后的字典5{'Wx': 34567, 'YY': 10100}

5.字典推导式

书上的实例:

import random		# 导入生成随机数模块 random
zi = {i:random.randint(0, 100) for i in range(1, 5)}
print('生成 100 以内的 4 个随机数字典:',zi)

输出结果:

生成 100 以内的 4 个随机数字典: {1: 7, 2: 77, 3: 18, 4: 73}

列表、元组、字典 的推导式集合观察,可以看到三种推导式差异不大:

列表推导式:

import random		# 导入生成随机数模块 random
liebiao1 = [random.randint(10,100) for i in range(5)] # 创建列表,并规定生成元素条件,和选择语句的条件表达式有些相似
print ("随机数列:",liebiao1)

输出结果:
随机数列: [77, 42, 53, 57, 23]	# 随机数列每次执行结果各不相同

元组推导式:

import random		# 导入生成随机数模块 random
yuan = (random.randint(10,100) for i in range(5)) # 按条件创建元组
print ("随机数列:",tuple(yuan))	#转换生成器对象为元组
print ("随机数元组:",yuan)

输出结果:
随机数列: (16, 31, 27, 14, 32)

最后总结一下,列表、元组、字典的区别:

数据结构是否可变是否有序定义符号字典 key
列表可变有序[ ]不可以
元组不可变有序( )可用
字典可变无序{key:value}-

2021年8月8日 更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值