zoukankan      html  css  js  c++  java
  • DAY5 Python基础类型之字典

    字典:

      (1)字典是python中的基本数据类型,能能够存储大量的关系型数据。

      (2)字典是由“键:值”对的形式存储数据的,键与值是一对多的关系,键是唯一

      (3)字典也称为映射,是python中唯一的映射关系。

      (4)字典的值是通过键来引用。

      # 可变类型数据与不可变类型数据:

      可变类型数据:又称为不可哈希的数据,例如:列表list,字典dict

      不可变类型数据:又称为可哈希的数据,例如:字符串str,数字int,元组tuple

      **** 字典的键必须是不可变类型的数据(通用使用字符串,数值作为键)*****

    # 创建字典

    方式一:直接创建
    # 字典可以存储任意数目的数据类型
    info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'book':{'name':'python', 'price':80} }

    方式二:dict()工厂函数
    dic = dict({'name':'he','age':23})
    print(dic)
    >>>
    {'name':'he','age':23}

    方式三: fromkeys(iterable,value)
    dic = dict.fromkeys([1,2,3],'he')
    print(dic)
    >>>
    {1: 'he', 2: 'he', 3: 'he'}

    #####知识点:fromkeys的陷进########
    dic1 = dict.fromkeys([1,2,3],[])
    print(dic1)
    >>>{1: [], 2: [], 3: []}
    dic1[1].append('alex')
    print(dic1)
    >>>{1: ['alex'], 2: ['alex'], 3: ['alex']}
    print(id(dic1[1]))
    print(id(dic1[2]))
    print(id(dic1[3]))
    >>>

    1823385461640
    1823385461640
    1823385461640

    总结:通过fromkeys()的默认值如果是一个[]空列表的话,这个列表是共用的,对列表进行操作,会影响到其他键值对。。。

    # 字典的具体操作

     (1)增

      #两种方法:

      第一种:字典['键'] = 值,若有此键就修改,如果没有就添加。

      第二种:setdefault(k,d=None), 若有这个键就不变,没有这个键就添加(可以设置默认值)

    '''第一种:‘字典['键'] = 值’  若有这个键就修改,否则就添加''
    info = {
        'name':'he',
        'age':23,
        'city':'guangzhou',
    }
    
    # sex这个键不存在,所以会添加新的键值对
    info['sex'] = 'male'
    print(info)
    >>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'}
    
    # age这个键已经存在,所以会修改其对应的值
    info['age'] = 18
    print(info)
    >>>{'name': 'he', 'age': 18, 'city': 'guangzhou', 'sex': 'male'}
    '''第二种:setdefault(k,d=None)  若有这个键就不变,没有这个键就添加(可设置默认值) '''
    
    info = {
        'name':'he',
        'age':23,
        'city':'guangzhou',
    }
    
    # sex这个键不存在,所以添加,并且返回对应的值
    new_value=info.setdefault('sex','male')       
    print(info)
    print(new_value)
    >>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'}
    >>>male
    
    #字典中有此key,不做任何操作,但会返回此键对应的值!!!!
    new_value = info.setdefault('name','sitian')   
    print(info)
    print(new_value)
    >>>{'name': 'he', 'age': 23, 'city': 'guangzhou'}
    >>>he
    

      (2) 删

      第一种方法:del语句  

        del dict[key] : 删除对应的键值对,如果键不存在会报错。

        del dict  : 在内存级别删除整个字典。

    info = {
        'name':'he',
        'age':23,
        'city':'guangzhou',
    }
    
    # 键存在,则删除对应的键值对
    del  info['city']
    print(info)
    >>>{'name': 'he', 'age': 23}
    
    #若键不存在,则会报错
    del info['book']
    print(info)
    >>>
    KeyError: 'book'
    
    
    #在内存级别,删除整个列表
    del info
    

      第二种方法:

    '''pop(k,None):通过键去删除键值对,也有返回值;如果键不存在,会报错(添加None参数解决)'''
    info = {
        'name':'hesihao',
        'age':23,
        'city':'guangzhou',
        'book':{'name':'python',
                'price':80}
    }
    # 键存在,会删除并返回被删除的元素
    res = info.pop('book')           
    print(res)
    print(info)
    >>> male
    >>>{'name': 'hesihao', 'age': 23, 'city': 'guangzhou'}
    
    # 如果键不存在,则会报错
    res = info.pop('job')
    print(res)
    print(info)
    >>>KeyError: 'job'
    
    #上面的报错,可以通过设置默认值来解决,若键不存在,则返回指定的值
    re1 = info.pop('name1','没有此键')   #没有此键,但是默认值时,会返回默认值。
    print(re1)
    >>>没有此键
    

      第三种方法:

      '''clear():清空字典键值对,单保留自己本身'''

    dic = {'name':'hesihao','age':23}
    dic.clear()
    print(dic)
    >>>{}
    

      第四种方法:

    '''popitem(): 3.5以前的版本随机删除某个键值对,并返回。3.6版本默认删除最后一个元素并返回,意义不大'''
    dic = {'name':'hesihao','age':23}
    res = dic.popitem()
    print(res,type(res))   #返回元组,元组第一个元素为键,第二个元素为值
    

     (3)改

      第一种方法:通过 dict[key] = value,如果key存在,则修改其对应值

    info = {
        'name':'hesihao',
        'age':23,
        'city':'guangzhou',
        'sex' : 'male'
    }
    info['city'] = 'shenzhen'
    print(info)
    >>>{'name': 'hesihao', 'age': 23, 'city': 'shenzhen', 'sex': 'male'}
    

      第二种方法:update()

    dic = {'name':'he','age':23}
    dic.update(city='guangzhou',job='python')    #通过key=value的形式,把键值对追加到字典中
    print(dic)
    
    
    #对于两个字典:将dic2中的所有键值对覆盖并添加到dic1中
    dic1 = {'name':'jin','age':'18','sex':'male'}
    dic2 = {'name':'alex','weight':75}
    dic1.update(dic2)
    print(dic1)
    print(dic2)
    >>>
    {'name': 'alex', 'age': '18', 'sex': 'male', 'weight': 75}
    {'name': 'alex', 'weight': 75}
    

     (4) 查

      第一种方法:dict[key] ---> value

    info = {
        'name':'hesihao',
        'age':23,
        'city':'guangzhou',
        'sex' : 'male'
    }
    print(info['name'])
    print(info['age'])
    

      第二种方法:get()方法

    #1.如果有对应的值,返回value
    info = {
        'name':'he',
        'age':23,
        'city':'guangzhou',
        'sex' : 'male'
    }
    print(info.get('name'))
    >>>he
    
    #2.如果没有对应的值,返回None,不会报错
    res = info.get('job')
    print(res)
    >>>None
    
    #3.可以设置默认的返回值:dict.get(key,default)
    res = info.get('job','python')
    print(res)
    >>> python
    

      第三种方法:遍历字典

    (1) dict.keys()---->返回字典的所有键
    (2) dict.values() -----> 返回字典的所有值
    (3) dict.items()----->返回所有键值对
    info = {
        'name':'hesihao',
        'age':23,
        'city':'guangzhou',
        'book':{'name':'python',
                'price':80}
    }
    
    key_list = [ key for key in info.keys()]
    print(key_list)
    
    value_list = [ value for value in info.values()]
    print(value_list)
    
    for k,v in info.items():
        print(f'Key:{k}')
        print(f'Value:{v}')
        

    # 补充知识点:

      题目一: dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'},把含有"k"的键删除。

    dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
    for i in dic.keys():
        if 'k' in i:
            del dic[i]
    print(dic)
    >>>
    RuntimeError: dictionary changed size during iteration
    
    -----为什么会报错呢?有过列表的经验,我们应该很快就能定位到问题。在循环中修改字典,字典就会相对应的发生了变化----------
    # 谨记:在循环一个字典时,不能改变字典的大小
    # 思路:可以在循环一个其他数据类型的时,对字典进行修改
    # 方式一:
    dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
    dic1 = {}
    for i in dic.keys(): #['key1','key2','k3']
    if 'k' not in i:
    dic1[i] = dic[i]
    dic = dic1
    print(dic1)

    #方式二:可以循环列表中,修改字典,这样就不会影响了
    lst =[]
    for key in dic:
    if 'k' in key:
    lst.append(key)
    for key in lst:
    dic.pop(key)
    print(dic)

    # 在观察一下,上面的low写法,其实可以改变一下:
    dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
    for i in list[dic.keys()]:      # 把dic.keys()转化为一个列表,这样就可以i循环的元素固定下来
        if 'k' in i:
            del dic[i]
    print(dic)

      

      

     

     

     

      

  • 相关阅读:
    eclips断点调试
    单位换算
    信息论与编码复习
    嵌入式学习笔记
    DAVINCI项目日志
    英语考试方法
    虚拟机安装Ubuntu的上网设置(有线网络和无线网络)
    重装系统必须备份的几种数据
    linux笔记
    word应用技巧
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9443376.html
Copyright © 2011-2022 走看看