zoukankan      html  css  js  c++  java
  • python学习之数据类型(dic)

    3.8 字典

    3.8.1 字典的介绍

    ​ 字典(dict)是python中唯一的一个映射类型,它是以{ }括起来的键值对组成,在dict中key是唯一的。在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,在dict中存储的key-value中的key必须是可hash的,可以改变的都是不可哈希的,那么可哈希就意味着不可变。这个是为了能准确的计算内存地址而规定的。已知的可哈希(不可变)的数据类型: int, str, tuple, bool;不可哈希(可变)的数据类型: list, dict, set

    ​ 字典能够存储大量的数据,比列表还要大;字典查找数值更方便;对数据可以进行关联;字典比较消耗内存

    ​ 有明确对应关系时,推荐使用字典

    语法 :
    {key1: value1, key2: value2....}
    注意: key必须是不可变(可哈希)的,value没有要求。可以保存任意类型的数据,因为key的存在,字典的查询效率非常的高。

    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)])
    
    #不合法
    dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
    dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不不能作为key
    dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key
    

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

    3.8.2 字典的相关操作

    1.增加

    常规:dic[key] = value

    #增加
    dic = {}
    dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增一个key-value的组合进dict
    dic['age'] = 18
    print(dic)
    
    

    不可替换:dic.setdefault('Key','value')

    如果key已经在字典中出现过了,那么这条命令就不进行增加操作。

    # 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值
    dic.setdefault('盖伦') # 也可以往里面设置值
    dic.setdefault("盖伦", "德玛西亚") # 如果dict中已经存在了,那么setdefault将不会起作用
    print(dic)
    

    2.删除

    dic.popitem() #随即删除

    dic.pop('Key') #定向删除,返回被删除的value

    del dic[Key] #del删除指定的键值对

    dic.clear() #清空,得到一个空的字典

    注意:当字典在迭代过程中,是不能进行删除或添加操作,因为迭代是无序的。如果要进行删除操作,把要删除的元素暂时先保存在⼀个list中,然后循环list,对dic进行删除操作。

    3.修改和查询

    修改

    dic['Key'] = 新的value key再字典中存在,就是修改;key不在字典时,就添加

    dic.update(dic2) #dic2中的Key与dic里的key一致时,替换value;如果dic2中的key不存在dic中,则在dic中新增该键值对;如果dic中有dic2没有的Key则该键值对保持不变。

    查询

    print( dic[key] ) #key不存在时会报错;可以使用加减乘除运算

    dic[key] += 5

    print( dic.get(key,key不存在时返回的内容) #key不存在时返回None,该返回值可自定义;不能对其进行赋值

    setdefault('key') ##1.新增(先看有没有Key,如果有直接进行查询;如果没有,则新增然后查询返回value) 2.根据key把value值返回

    4.遍历

    字典的遍历--keys()

    ​ 输出的是一个dict_keys类型的列表,可以进行for循环,但是不能使用索引。

    ### 字典的遍历
    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    print(dic.keys())   #高仿列表,类型是dict_keys
    for key in dic.keys():
        print(key)  #拿到key
        print(dic[key])   #拿到value,实现对value的遍历
    

    字典的遍历--values()

    输出的也是一个dict_keys类型的列表,可以进行for循环,但是不能使用索引。

    注意:通过key可以找到value但是通过value找不到key!!

    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    print(dic.values())   #通过value是拿不到Key的
    for value in dic.values():  #只能遍历value
        print(value)
    

    字典的遍历--键值对items()

    只有元组的列表,元组里边是键值对

    [(key1,value1),(key2,value2),(key3,value3)...]

    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    print(dic.items())  #只有元组的列表,元组里边是键值对信息
    for item in dic.items():
        print(item)  #输出的是元组
        print(item[0],item[1])
    

    字典的遍历--脑路清奇版

    首先,介绍一个解包小知识,解包时前边变量的个数必须与后边解包的个数必须一致。

    a,b = (10,20)  #解构,解包,元组、列表都具有该功能
    print(a)  
    print(b)
    ###前边变量的个数必须与后边解包的个数必须一致
    a,b,c = '你好啊'
    print(a,c)  #输出   你 啊
    

    实现:当需要遍历字典,在操作中涉及到key和value的时候,直接版是最佳选择

    #含蓄版
    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    for item in dic.items():
        k,v = item
        print(k)
        print(v)
    #直接版
    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    for k,v in dic.items():
        print(k)
        print(v)
    

    字典的遍历--key迭代版

    因为字典本身就是一个可迭代的对象,可以直接进行for循环

    #先看一下如果直接对字典进行迭代的话会是什么情况
    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    for el in dic:
        print(el)  #直接输出的只有Key,那么是不是可以用key把value给印出来呢?
        print(dic[el])  #答案是可以的
    

    5.字典的嵌套

    在写字典嵌套时,一点更要注意元素与元素之间不要忘记加逗号。

    dic = {
        'name' : '盖伦',
        'age'  : 24,
        'slogan' :'德玛西亚',
        'family': {
                '皇子' : '嘉文四世',
                '总管' : '赵信',
                '女警' : {
                    'name' : '凯特琳',
                    'age'  : 23 ,
                    'slogan':'我,miss,怎么可能'
                        }
                    } ,
        'equipment': [
    
            {'num1':'黑切','use':'kill','gank':'Yes'},
            {'num2':'日炎','use':'堆肉','gank':'No'}
                        ]
            }
    print(dic['equipment'][1]['gank'])  #查看盖伦第二个装备是否适合gank
    dic['family']['总管'] = dic['family']['总管'] + '总管'  #修改德邦的信息
    print(dic['family']['总管'] )
    

    6. enumerate(dict,start)枚举

    ​ 给要迭代的对象加一个序号;

    ​ 把字典的key与数字结合起来,输出一个元组;start默认从0开始,可以修改成任意值

    dic = {'盖伦':'德玛西亚','戴安娜':'月光女神','猴哥':'齐天大圣'}
    for i,k in enumerate(dic,1):
        print(i,k)
    #输出
    1 盖伦
    2 戴安娜
    3 猴哥
    

    字符串和列表中也可以使用。

    7. fromkeys()

    formkeys()的作用是帮助我们通过list创建字典,它是一种类的方法,它不直接对应对象,即能创建新的字典,不能更改已创建的字典。

    语法:dic = fromkeys(keys,values),这里的key和value都是列表

    keys用的是同一个value,如下:

    lis = ['德玛西亚之力','皇子','赵信','女警']
    lis1 = ['lol','英雄联盟']
    d = dict.fromkeys(lis1,lis)
    print(d)
    print(id('lol'),id('英雄联盟'))#查看两个key的ID
    #输出
    {'lol': ['德玛西亚之力', '皇子', '赵信', '女警'], '英雄联盟': ['德玛西亚之力', '皇子', '赵信', '女警']}
    2248951452984 2248950434288  #两个key的ID相同
    

    看大坑来了:当对一个key的value进行修改时,会直接同步给其他的key。

    ​ 当对'lol'的value进行修改时,因为与'德玛西亚'共用一组value,因此会直接影响'德玛西亚',如下:

    d.get('lol').append('李菁')
    print(d)
    #输出
    {'lol': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁'], '英雄联盟': ['德玛西亚之力', '皇子', '赵信', '女警', '李菁']}
    
    仅供参考,欢迎指正
  • 相关阅读:
    ext导出表格数据到excel中
    Oracle 外连接和 (+)号的用法
    通过json取树
    最简单的extjs 树
    extjs放在本地tomcat中部署运行
    extjs viewport panel tabPanel tree
    jsp注意的问题(初学)
    查看进程的路径,不用第三方软件
    vc常用技巧
    表单中单选按钮的有效性控制问题
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/10998275.html
Copyright © 2011-2022 走看看