python基础之数据类型III

python基础之数据类型III

5.Dictionaries(字典)

5.1字典的认识

  • 引子

    我已经讲过的数据类型 int float str bool tuple list,我们讲的列表的数据类型有什么缺点?

    • 列表数据类型如果存储的数据量较大,查询速度慢。

    • 列表容器型数据类型存储的数据之间的关联性不强。

      ['旋哥', 22, '男', '小金', 22, '男', '唱跳rap篮球']
      
    • 针对于上述的列表的两种缺点,python提供了另一种容器型数据类型,

      • 字典dict。字典是以{}括起来,通过键值对的形式存储的容器型数据类型。他存储的数据量没有list的数据量大,但是字典的查询速度非常快,并且字典存储的数据之间的关联性较强。

      • 字典从python3.7以后都是有序的。

        字典的查询类似于二分查找:每次查询一半,从一半这个数字与目标数字对比,如果比目标数字小,则在从一半与目标数字取一半,在次查询.....
        比如,100个数字,我要找到任意一个数字,二分查找算法找不超过2**n > 100  n=7次。
        
  • 字典的键一定是唯一的,并且是不可变的数据类型,字典的值是任意数据类型。

    # 判断以下字典哪个合法?
    {"name": "barry", 1: 333}
    {1.4: 666, [1,2]: 777}
    {(22, 33): 555, 'age': 18}
    {([11,22]): 34, 1: 1}
    
    # 
    {
    	'旋哥': {'name': '旋哥', 'age': 22, 'hobby': '跑步'},
    	'name_list': ['小金', '明天', '阿珍']
    }
    

5.2字典的操作

5.2.1字典的创建
  • # 方式一 简单创建
    dic1 = {'name': 'Allen', 'age': 25, 'hobby': ['girl', '球类运动', '台球']}
    
    # 方式二
    dic2 = dict((('one', 1), ('two', 2), ('three', 3)))
    print(dic2)
    
    # 方式三
    dic3 = dict(name='Allen', age=25, sex='男')
    print(dic3)
    
  • 字典的键是唯一的,我们所有的通过字典的操作都是通过键去操作键值对,我们可以把字典的键当做列表的索引。方便你理解。

5.2.2字典的增、改
  • dic1 = {'name': 'Allen', 'age': 25}
    
    # 方式一 有责改之,无责增加
    # dic1['sex'] = '男'
    # dic1['name'] = '明哥'
    # print(dic1)
    
    # 方式二 有责改之,无责增加
    # dic1.update(sex='男', hobby='girl')
    # dic1.update({'hobby': ['girl', '球类运动']})
    # dic1.update({'name': '天哥', 'hobby': 'run'})
    # print(dic1)
    
    # 方式三 有则不变,无责增加
    # dic1.setdefault('sex', '男')
    dic1.setdefault('name', '豪哥')
    print(dic1)
    
5.2.3字典的删
  • dic1 = {'name': 'Allen', 'age': 25}
    
    # 方式一:pop 按照键去删除键值对,返回对应的值
    # ret = dic1.pop('name')
    # print(ret)
    
    # 方式二 del
    # del dic1['name']
    # del dic1
    
    # 方式三:clear
    dic1.clear()
    print(dic1)
    
5.2.4字典的查
  • dic1 = {'name': 'Allen', 'age': 25}
    dic1 = {'name': 'Allen', 'age': 25}
    
    # 方式一 直接查询(不推荐)
    
    # ret = dic1['name']
    # ret = dic1['name1']
    
    # 方式二: get (推荐)
    # ret = dic1.get('name')
    # ret = dic1.get('name1')
    # 还可以设置返回值
    # ret = dic1.get('name1', '没有此键')
    
    # 方式三 :setdefault 有奇用
    # ret = dic1.setdefault('name')
    ret = dic1.setdefault('name1')
    print(ret)
    
  • 特殊查询

    dic1 = {'name': 'Allen', 'age': 25, 'card': '6217 0001 9000 2473 653'}
    # for循环遍历 直接循环,循环字典的键
    # for i in dic1:
    #     print(i)
    
    # 获取字典所有的键  类似于列表,可以转化成列表,也可以直接循环。
    # keys = dic1.keys()  # dict_keys(['name', 'age', 'card'])
    # # print(list(keys))
    # # print(keys)
    # for i in keys:
    #     print(i)
    
    # 获取字典所有的值 类似于列表,可以转化成列表,也可以直接循环。
    # values = dic1.values()
    # print(list(values))
    # print(values)
    # for val in values:
    #     print(val)
    #
    # 获取字典所有的键值对 类似于列表,可以转化成列表,也可以直接循环。
    # items = dic1.items()
    # # print(list(items))
    # # print(items)
    # for i in items:
    #     print(i)
    

5.3解构

也叫做分别赋值

  • # a = 10
    # 变量与值一一对应
    # a, b = 10, 20
    # print(a,b)
    
    # a, b, c = ('Allen', '旋哥', 666)
    # a, b, c = ['Allen', '旋哥', 666]
    # print(a, b, c)
    
    # a, b = (1, 2, 3)
    # print(a, b)
    
    # 面试题 有变量a = 10, 变量b = 30 用最简单的方法让a,b两个变量的值互换。
    a = 10
    b = 30
    a, b = b, a  # a, b = 30, 10
    print(a, b)
    
    # 延展
    
    dic1 = {'name': 'Allen', 'age': 25, 'card': '6217 0001 9000 2473 653'}
    # for item in dic1.items():
    """
        第一次循环:
        item  = ('name', 'Allen')
        第二次循环:
        item  = ('age', 25)
        .....
    """
        # print(item)
    
    # for key, val in dic1.items():
        """
            第一次循环:
            key, val  = ('name', 'Allen')
            第二次循环:
            key, val  = ('age', 25)
            .....
        """
        # print(key, val)
    

5.4字典的嵌套

  • dic = {
        'name': '阿峰',
        'age': 48,
        'wife': [{'name': '国际小章', 'age': 38}],
        'children': {'girl_first': '苹果', 'girl_second': '小怡怡', 'girl_three': '小顶顶'}
    }
    
    # 1. 获取阿峰的名字。
    # print(dic.get('name'))
    #
    # 2.获取这个字典:{'name':'国际小章','age':38}。
    # lst = dic.get('wife')
    # print(lst[0])
    # 3. 获取阿峰妻子的名字。
    # ret = dic.get('wife')[0].get('name')
    # print(ret)
    #
    # 4. 将阿峰的第三个孩子名字改成 xx.
    # print(dic.get('children')['girl_three'])
    dic.get('children')['girl_three'] = 'xx'
    print(dic)
    
    

6.Sets(集合)

6.1集合的介绍

  • 集合,set,python的基础数据类型,它是以{}括起来,通过逗号隔开的容器型数据类型。集合是无序的,集合要求它里面的数据是不可变的数据类型,并且不能重复,但是集合本身是可变的数据类型。

  • 集合的优点:

    • 列表去重。

    • 关系测试。(测试两个集合的交集,并集,差集,反交集等)

  • 测试集合的合法性:

    # set1 = {10, True, 'Allen', (1, 2, 3)}
    # print(set1)
    # # set1 = {10, [1, 2, 3], 'Allen', (1, 2, 3)} # 错误
    # set1 = {10, {'name': '小金'}, 'Allen', (1, 2, 3)} # 错误
    # print(set1)
    
    # 空集合如何显示?
    # print({}, type({}))
    set1 = set()
    print(set1, type(set1))
    
  • 列表的去重

    l1 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6]
    # 将l1列表进行去重。
    # list ---> set
    set1 = set(l1)
    print(set1)
    # set ---> list
    print(list(set1))
    # 将l1列表进行去重(不让使用集合)。
    自己想。
    

6.2集合的常用操作

6.2.1增
  • set1 = {'Allen', '珍哥', '树哥', '姚哥'}
    # add
    # set1.add('硕哥')
    # print(set1)
    
    # 迭代着增加 update
    # set1.update('abc')
    set1.update([1, 2, 3])
    print(set1)
    
6.2.2删
  • # pop 随机删除有返回值
    # ret = set1.pop()
    # print(ret)
    # print(set1)
    
    # remove 按照元素删除
    # set1.remove('聪哥')
    # print(set1)
    
    # clear清空
    # set1.clear()
    # print(set1)
    
6.2.3改
  • # 先删除后增加
    # set1.remove('Allen')
    # set1.add('男神')
    # print(set1)
    
6.2.4查
  • for i in set1:
        print(i)
    

6.3集合的关系测试

  • 交集、反交集、并集、差集、子集、超集

    • set1 = {1, 2, 3, 4, 5}
      set2 = {4, 5, 6, 7, 8}
      
      # 交集
      print(set1 & set2)
      print(set1.intersection(set2))
      
      # 反交集
      print(set1 ^ set2)
      print(set1.symmetric_difference(set2))
      
      # 并集
      print(set1 | set2)
      print(set1.union(set2))
      
      # 差集
      print(set1 - set2)  # set1独有的
      print(set1.difference(set2))
      print(set2 - set1 )  # set2 独有的
      
      # 子集
      set1 = {1, 2, 3, 4, 5}
      set2 = {3, 4, 5}
      print(set1 > set2)  # set1 是set2 超集
      print(set1.issuperset(set2))  # set1 是set2 超集
      
      print(set2 < set1)  # set2 是set1的子集
      print(set2.issubset(set1))  # set2 是set1的子集
      
  • 冻集合

    • 集合本身是可变的数据类型,我们可以将集合变成不可变的数据类型,将集合冻起来。

    • set2 = {3, 4, 5}
      set3 = frozenset(set2)
      # print(set3)
      print(set(set3))
      # dic = {set3: 666}
      # print(dic)
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值