• (十二)字典简介及字典的用法


    举个例子,如果一个公司要存员工的信息,应该怎么去存,怎么去取?列表可以吗?
    info=[["alex",22,"teacher",3000], ["oldboy",56,"teacher",4000,13022452346...],... ]如果按照这么存,那么取得时候肯定按照索引去取
    info.index(["oldboy",56,"teacher",4000,..])要把所有的信息都写出来,才能提取,试问,都知道所有的信息了,还取什么?再说若果有几千行数据,怎么去查找呢?
    显然:列表存这样的数据时不行的。要用字典,字典格式如下例子:
     
    字典的一个特性:字典是无序的。为什么是无序的,列表为什么有序?
    通过key就能取到值,不通过下标。而列表里面之所以有顺序,是因为通过下标能取值,是因为列表里有一个表,暂时理解为“索引表”。
    而字典里,没有“索引表”,所以说没顺序了,
     
    字典的key是唯一的,天生就是唯一的,字典是怎么实现的唯一?
    字典通过hash来实现的,也叫散列,通过一些数学算法,你传给它一些字符串,生成一些数字且是唯一的数字,如下图:

    注意:-2104520618,在当前程序是唯一的,退出后,重新hash,就不是这个数字了。

    为什么字典,和hash有关系?

    每一个key值,先转成hash值,举个例子如下,把“alex”,“jack”,“rain”分别hash,得到一个数:
    [1212,232,434,5656,34331]
    ["alex","jack","rain"]
    字符串,“alex”,“jack”,“rain”之间没有一点儿规律和联系,除非在数字之间去找规律:给数字排序,在数字之间找联系
    [232,434,1212,5656,34331],然后就可以用到算法:
    比如:
    [232,434,555,666,777,888,1212,5656,34331]怎么找到5656?
    第一步,先找到中间的777,然后判断,再取中间值判断

    第二步:找规律,有多少数据,就找2的多少次方,如果有42亿数据,找32次就找出来了。

    如果让“alex”in ["alex","jack","rain"],找alex,加入这个列表有10000个,alex在第5000个,思路同上,这就是算法的魅力。
    这样查找就快了。
    hash表已经是排序好的了,这就是字典快的原因,而列表还要排序,维护一个“索引表”。
    字典的用法:
    ----增
    ----删
    ----改
    ----查
    names = {
    "stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
    "stu1102":"Jack",
    "stu1103":"rain",
    }
    查:
    (1)print(names["stu1101"]["hobbie"])-----------查
    print(names["stu1104"]["hobbie"])-------------stu1104没有会报错-----------------------先判断在不在:
    (2)print("stu1101" in names )----------------------True---在
    print("stu1104" in names )----------------------False----不在
    (3)print(names.get("stu1104"))----------没有返回一个 none
    print(names.get("stu1101"))-------------有的话返回值
    print(names.get("stu1104","asdfg"))------自定义一个值,返回asdfg
    增:
    names["stu1104"] = ["yangJian",31,"DBA"]
    print(names)
    改:
    names["stu1104"][0] = "YANGJIAN"
    print(names)
    删:
    (1)print(names.pop("stu1102"))
    print(names)
    (2)del names["stu1103"]
    print(names)
    ————————————————————————————————————————————————
    formkeys:
    (1)
    names = ["Jack","alex","eric"]
    print (dict.fromkeys(names,0))
    (2)
    names = ["Jack","alex","eric"]
    n3 = dict.fromkeys(names,1)
    n3["Jack"]=2
    print(n3)
    {'Jack': 2, 'alex': 1, 'eric': 1}
    (3)
    names = ["Jack","alex","eric"]
    n3 = dict.fromkeys(names,[1,2,3])
    n3["Jack"][1]=9
    print(n3)
    {'Jack': [1, 9, 3], 'alex': [1, 9, 3], 'eric': [1, 9, 3]}-----为什么都变了?
    看内存地址:
    names = ["Jack","alex","eric"]
    n3 = dict.fromkeys(names,[1,2,3])
    #n3["Jack"][1]=9
    print(id(n3["Jack"]),id(n3["eric"]))
    5961568 5961568-----------------------------------------------内存地址一样
    解释: a = 23 b =a a =40 b =23
    a = [1,2,3]
    b =a
    现在把里面的2改成9,这时候a没有开辟新的内存空间
    ,只是把2变成9,内存空间不变化
    ————————————————————————————————————
    items:一般来做循环
    因为print(names.items())得到一个这样的列表: ('stu1102', 'Jack'), ('stu1103', 'rain')
    变成一个元组,有k,v
    (1)for key in names:
    print(key,names[key])--------效率高

    (2)for k,v in names.items():-----效率低
    print(k,v)
    -------------------------------------------------------------
    keys vlaus
    print(names.keys())
    print(names.values())
    -----------------------------------------------------------
    popitem------随机删除
    names.popitem()
    print(names)
    ----------------------------------------------------------
    setdefault:
    print(names.setdefault("stu1106","Racheal"))
    print(names)
    ---------------------------------------------------------
    update:合并2个字典
    d1 ={"stu1102":"JACK",1:333,2:444}
    names.update(d1)
    print(names)
    --------------------------------------------------------
    字典的特性:无序,去重,查询效率高
    --------------------------------------------------------
    copy:
    names = {
    "stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
    "stu1102":"Jack",
    "stu1103":"rain",
    }
    n2 = names.copy()
    print(names)
    print(n2)
    -----------------------------------------------------------
    names = {
    "stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
    "stu1102":"Jack",
    "stu1103":"rain",
    }
    n2 = names.copy()
    names["stu1103"] = "RAIN"________________________________>>>
    print(names)
    print(n2)

    {'stu1101': {'name': 'Alex', 'age': 22, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'RAIN'}
    {'stu1101': {'name': 'Alex', 'age': 22, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'rain'}

    -----------------------------------------------------------------------------------------------
    names = {
    "stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
    "stu1102":"Jack",
    "stu1103":"rain",
    }
    n2 = names.copy()
    names["stu1103"] = "RAIN"
    names["stu1101"]["age"]= 24-------------------------------->>
    print(names)
    print(n2)

    {'stu1101': {'name': 'Alex', 'age': 24, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'RAIN'}
    {'stu1101': {'name': 'Alex', 'age': 24, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'rain'}
    ----------------------------------------------------------------------------------------

     

     
     

     

     

     
  • 相关阅读:
    appium 搭建及实例
    appium运行时每次默认弹出appiumsetting与unlock重装,关闭这两个步骤的方法
    APPIUM
    分析DuxCms之AdminController
    分析DuxCms之AdminUserModel
    THINKPHP 调试------输出sql语句
    html 标签内联元素和块元素分类【转】
    thinkphp实现数据分页
    thinkphp框架实现删除上传的文件
    初入thinkphp
  • 原文地址:https://www.cnblogs.com/gaojun2017/p/6336456.html
Copyright © 2020-2023  润新知