zoukankan      html  css  js  c++  java
  • python 数据类型三 (字典)

    一、字典的介绍

      字典(dict)是python中唯一的一个映射类型,它是以{}括起来的键值对组成,在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法,所以,切记,在dict中存储的key-value中的key必须是可hash的,如果你搞不懂什么是可哈希,暂时可以这样记:可以改变的都是不可哈希的,那么可哈希就意味着不可变。这个是为了能准确的计算内存地址而规定的。

      已知的可哈希(不可变)的数据类型:int,str,bool,tuple

      不可哈希(可变)的数据类型:list,dict,set

      语法:{key1 : value1 , key2 : value2 … }

      注意:key必须是不可变(可哈希)的,value没有要求,可以保存任意类型的数据。

    复制代码
        #合法
        dic = {
            123: 456,
            True: 999,
            "id": 1,
            "name": 'sylar',
            "age": 18,
            "stu": ['帅哥', '美女'],
            (1, 2, 3): '麻花藤'
        }
        print(dic[123])
        print(dic[True])
        print(dic['id'])
        print(dic['stu'])
        print(dic[(1, 2, 3)])
        #不合法
        dic1 = {[1, 2, 3]: '周杰伦'}    # list是可变的. 不能作为key
        dic2 = {{1: 2}: "哈哈哈"}     # dict是可变的. 不能作为key
        dic3 = {{1, 2, 3}: '呵呵呵'}   # set是可变的, 不能作为key
    复制代码

      dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash(可哈希)表的顺序,而hash(可哈希)表不是连续的,所以dict不能进行切片工作,它只能通过key来获取dict中的数据。

    二、字典的增、删、改、查和其他相关操作

    2.1 增

           字典的增加操作有:dic[key] = value,dic.setdefault(key , value),具体用法如下示例:

    复制代码
        dic = {}
        dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增一个key-value组合
        dic['age'] = 18
        print(dic)  # 结果为:{'name': '周润发', 'age': 18}
        # 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值
        dic.setdefault('李嘉诚') # 也可以往里面设置值,dict中增加键值对‘李嘉诚’:None,返回值是None
        print(dic)   # 结果为:{'name': '周润发', 'age': 18, '李嘉诚': None}
        dic.setdefault("李嘉诚", "房地产") # 如果dict中已经有这个key了. 那么setdefault将不会起作用,返回值是这个key对应的dict中的value值
        print(dic)    # 结果为:{'name': '周润发', 'age': 18, '李嘉诚': None}
        dic.setdefault("李嘉","18") # dict中增加键值对“李嘉”:“18”,返回值是18
        print(dic)   # 结果为:'name': '周润发', 'age': 18, '李嘉诚': None, '李嘉': '18'}
    复制代码

    2.2 删除

           字典的删除操作有:pop[key],del dic[key],popitem(),clear,具体用法如下示例:

    复制代码
        dic = {"jay":"who","i":"wang","zhao":"jie","niu":"li"}
        ret = dic.pop("jay")  # pop有返回值,返回被删除的value值
        print(ret)  # 结果为:who
        del dic["i"]
        print(dic)
        ret = dic.popitem()  # 随机删除,返回一个元组(删除的key , 删除的value),可以用解构 k , v = dic.popitem()
        print(ret)   # 结果为:('niu', 'li')
        print(dic)  # 清空字典
    复制代码

      dic.pop()必须有一个参数key,即要删除的元素的key,否则报错,而list.pop()默认删除最后一个元素。

    2.3修改

           字典的修改操作有:dic[key] = value,dic.update(),具体如下示例代码:

    复制代码
        dic0 = {"1":"张三","2":"李四"}
        dic0["2"] = "王五"   # 强制修改
        print(dic0)  # 结果为:{'1': '张三', '2': '王五'}
    
        dic = {"id": 123, "name": 'sylar', "age": 18}
        dic1 = {"id": 456, "name": "麻花藤", "ok": "wtf"}
        dic.update(dic1) # 把dic1中的内容更新到dic中. 如果key重名. 则修改替    换. 如果不存在key, 则新增.
        print(dic) # 结果为:{'id': 456, 'name': '麻花藤', 'age': 18, 'ok': 'wtf'}
        print(dic1)  # 结果为:{'id': 456, 'name': '麻花藤', 'ok': 'wtf'}
    复制代码

    2.4查询

           查询一般用key来查找具体的数据,如get(key),dic[key],setdefault(key),还有for循环,具体如下:

    复制代码
        dic = {"id": 123, "name": 'sylar', "age": 18}
        print(dic['name'])
        # print(dic['ok']) # 没有这个键的时候会报错
        print(dic.get("ok")) # 没有这个键的时候返回None
        print(dic.get("ok", "牛B")) # 没有这个键时,第二参数可以指定返回内容,原dict内容不变,此打印结果为:牛B
        print(dic.setdefault("ok"))        # 没有这个键的时候会为dict增加键值对“ok”:None,并返回None,即此打印结果是None
    复制代码
        dic = {"id":123 , "name":"sylar" , "age":18}
        for i in dic:
            print(i)  # 获取到的是 key
            print(dic[i])  # 获取到的 value

    2.5 其他操作

      keys     获取到所有的键存在一个高仿的列表中;

      values   获取到所有的值存在一个高仿的列表中;

      items    获取到所有的键值对以元组的形式存在一个高仿的列表中;

      具体用法如下示例:

    复制代码
        dic = {"id": 123, "name": 'sylar', "age": 18, "ok": "科比"}
        print(dic.keys())
        # 结果为:dict_keys(['id', 'name', 'age', 'ok']) 不用管它是什么.当成list来用就行
        for key in dic.keys():
            print(key)
    
        print(dic.values())
        # 结果为:dict_values([123, 'sylar', 18, '科比']) 不用管它是什么. 也当list来用
        for value in dic.values():
            print(value)
    
        print(dic.items())
        # 结果为:dict_items([('id', 123), ('name', 'sylar'), ('age', 18), ('ok', '科比')]),这个东西也是list. 只不过list中装的是tuple
        for key,value in dic.items(): # 这个是解构
            print(key, value)
    
        # 解构:将后边解构打开按位置赋值给变量,支持:字符串、列表、元组
        a, b = 1, 2
        print(a, b)
        # print(type(a))
        (c, d) = 3, 4
        print(c, d)
    
        e, f = [1, 2, 3] # 解构的时候注意数量必须匹配,所以这样写不对
    复制代码

    三、字典的嵌套

           字典的嵌套示例如下:

    复制代码
        # 字典的嵌套
        dic1 = {
            "name": "汪峰",
            "age": 43,
            "wife": {
                "name": '章子怡',
                "age": 39
            },
            "children": ['第一个孩子', '第二个孩子'],
            "desc": '峰哥不会告我吧. 没关系的'
        }
        print(dic1.get("wife").get("name"))
        print(dic1.get("children"))
        print(dic1.get("children")[1]
    复制代码
  • 相关阅读:
    1253:抓住那头牛
    1251:仙岛求药
    1330:【例8.3】最少步数
    1329:【例8.2】细胞
    1216:红与黑
    1217:棋盘问题
    回溯法与深度优先搜索的关系
    自然数的拆分
    100——第35例
    100——第34例
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9402256.html
Copyright © 2011-2022 走看看