zoukankan      html  css  js  c++  java
  • Python-基础类型dict

    用途

    按key:value的形式存放多个任意类型的value,key反映的是value的属性
    因为字典的key是不能重复的,所以我们也可以利用这个特点来去重

    定义方式

    在{}内用逗号分隔开多个key:value,其中value可以是任意类型,而key必须是不可变的类型,通常是字符串类型。若key为可变类型,会报错显示unhashable,确切的说,字典的key是必须要有__hash__属性的对象,以下为一个实验例子。

    a = [1,2,3]
    d = {a:a}
    ---------------
    TypeError: unhashable type: 'list'
    

    报错显示,list不是一个可以hash的类,查看list源码,发现hash方法为None,而str型中,hash方法有定义

    # 部分源码
    class object:
        """ The most base type """
     
        def __hash__(self, *args, **kwargs):  # real signature unknown
            """ Return hash(self). """
            pass
          
    '''
    list类的源码中,__hash__设置了为None,所以虽然继承了object类,但是对于list来说,优先使用自己类中的
    __hash__
    '''
    class list(object):
        __hash__ = None
    # 相同情况的还有set与dict
    class set(object):
        __hash__ = None
    class dict(object):
        __hash__ = None
    

    我们发现,设置为None值的三个类型正好是仅有的三个可变类型。所以key必须是不可变类型

    字典的key是唯一的

    利用这一特点,我们可以利用字典来去重

    d={'k1':111,'k1':222,'k1':333}  # key重复,只保留一个最后一个
    d1={'k1':333,'k1':222,'k1':111}
    print(d)
    print(d1)
    ------------------
    {'k1': 333}
    {'k1': 111}
    
    

    生成字典

    # 生成字典的方式1
    l=[("name","egon"),("age",18),["gender","male"]]
    res=dict(l)
    print(res)
    
    # 生成字典的方式2
    d=dict(x=1,y=2,z=3)
    print(d)
    ------------------------------------------
    {'name': 'egon', 'age': 18, 'gender': 'male'}
    {'x': 1, 'y': 2, 'z': 3}
    
    # 生成字典的方式3
    '''
    通常利用fromkeys生成字典的值都设置为None,当然也可以是其他类型,不过不要设置为可变类型,因为此处的value存的是一个内存地址,如果是可变类型,当我们向其中添加数时,会使得所有的key对应的value都指向同一个可变类型。
    '''
    d1 = dict.fromkeys(('x', 'y', 'z'), None)
    d2 = dict.fromkeys(['x', 'y', 'z'], None)
    d3 = dict.fromkeys('xyz', None)
    print(d1)
    print(d2)
    print(d3)
    ------------------------------
    {'x': None, 'y': None, 'z': None}
    {'x': None, 'y': None, 'z': None}
    {'x': None, 'y': None, 'z': None}
    
    """
    针对上一个注释,通过下面的小练习可以更好的理解
    小练习:
    res = {}.fromkeys(['k1','k2','k3'],[])
    res.get('k1').append(123)
    
    print(res)的结果是?
    A:{'k1': [123], 'k2': [], 'k3': []}
    B:{'k1': [123], 'k2': [123], 'k3': [123]}
    C:报错
    D:我TMD的也不知道
    """
    答案:B
    
    # 空字典
    d={}
    print(type(d))
    

    字典去重

    # 注意,字典本身是无序的,我们看到打印出来和原来的顺序一样是因为pycharm的优化
    list1 = [1, 2, 3, 3, 4, 5, 5, 6]
    d = dict.fromkeys(list1, None)
    list1 = list(d)
    print(d)
    print(list1)
    ---------------------------
    {1: None, 2: None, 3: None, 4: None, 5: None, 6: None}
    [1, 2, 3, 4, 5, 6]
    

    常用操作+内置的方法

    优先掌握的操作:

    字典取值

    若key存在就取值,如不存在就加值,取值最好用get方法

    # 直接利用key取值,若key不存在则报错
    d = {'k1': 111, 'k2': 222}
    print(d['k1'])
    # print(d['k3'])  # KeyError: 'k3'
    -------------------
    111
    
    
    # 利用get取值,若不存在返回None
    d = {'k1': 111, 'k2': 222}
    print(d.get('k1'))
    print(d.get('k3'))
    ------------------
    111
    None
    
    # 利用get取值还可以自定义找不存在的key时的返回值,若不设置,默认返回None
    d = {'k1':111,'k2':222}
    res = d.get('k3','找一个存在的键啊,蠢蛋')
    print(res)  # 键不存在 返回get方法里面第二个参数
    ------------------------------------
    找一个存在的键啊,蠢蛋
    

    字典新增键值对

    """方式一:直接利用key"""
    d = {'username': 'yang', 'password': 123}
    d['hobby'] = 'study'  # 字典的key不存在新增
    print(d)
    d['username'] = 'king'
    print(d)  # 字典的key存在则修改
    ----------------------------------------------
    {'username': 'yang', 'password': 123, 'hobby': 'study'}
    {'username': 'king', 'password': 123, 'hobby': 'study'}
    
    """方式二,update,特点与方法一相同,存在key就修改,不存在就添加,此处key为字符串"""
    d = {'username': 'yang', 'password': 123}
    d.update(hobby = 'study')
    print(d)
    d.update(username = 'king')
    print(d)
    -------------------------------
    {'username': 'yang', 'password': 123, 'hobby': 'study'}
    {'username': 'king', 'password': 123, 'hobby': 'study'}
    
    # 若使用update方法,新增的key是一个变量,那么需要使用{:}的形式添加
    x = 'xxx'
    d = {'username': 'yang', 'password': 123}
    d.update({x: 123})  # 注意这个花括号不能少
    print(d)
    -------------------------------
    {'username': 'yang', 'password': 123, 'xxx': 123}
    
    
    """方式3 setdefault
    键如果存在的情况下 那么不做修改 而是将对应的value取出
    键如果不存在的情况下 那么就是新增
    """
    d = {'username': 'yang', 'password': 123}
    d.setdefault('xxx',123)
    print(d)  # 键不存在是新增
    res = d.setdefault('username',123)
    print(d)
    print(res)
    ------------------------
    {'username': 'yang', 'password': 123, 'xxx': 123}
    {'username': 'yang', 'password': 123, 'xxx': 123}
    yang
    

    清空clear

    d = {'k1': 111, 'k2': 222}
    d.clear()
    print(d)
    -----------
    {}
    

    长度len

    d={'k1':111,'k2':222}
    print(len(d))
    ------------
    2
    

    成员运算in和not in

    d={'k1':111,'k2':222}
    print('k1' in d)
    print(111 in d)
    --------------------
    True
    False
    

    删除

    万能删除del

    万能删除,没有返回值,代表的是单纯的删除

    d={'k1':111,'k2':222}
    del d['k1']
    print(d)
    ------------
    {'k2': 222}
    
    随机删除popitem

    返回一个元组

    d = {'k1':111,'k2':222,'k3':333}
    res = d.popitem()
    print(d,res)
    -----------------------
    {'k1': 111, 'k2': 222} ('k3', 333)
    
    取走操作pop

    指定key删除,有返回值,代表的是取走操作。与列表不同的是,列表不写参数或默认取走最后一个元素,在字典中,必须要传参数,不然会直接报错。

    d={'k1':111,'k2':222}
    res=d.pop('k1')
    print(d)
    print(res)
    -----------------------------
    {'k2': 222}
    111
    

    键keys(),值values(),键值对items() 与for循环

    # 键keys(),值values(),键值对items() 与for循环
    d = {'k1':111,'k2':222,'k3':333}
    for key in d.keys():
        print(key,end='  ')
    print()
    for value in d.values():
        print(value,end='  ')
    print()
    for k,v in d.items():
        print(k,v)
    ---------------------------------
    k1  k2  k3  
    111  222  333  
    k1 111
    k2 222
    k3 333
    

    Python3 字典 keys() 方法返回一个可迭代对象,可以使用 list() 来转换为列表。可以获取字典中所有的键并利用list方法强转为列表

    d = {'k1':111,'k2':222,'k3':333}
    res1 = d.keys()
    res1_iter = res1.__iter__()  # 返回值拥有__iter__方法。说明是一个可迭代对象
    print(res1,res1_iter)
    -----------------------------------------------
    dict_keys(['k1', 'k2', 'k3']) <dict_keyiterator object at 0x7f9b5fc435e0>
    
    
    # 若要获取字典中所有的key,并存入列表
    d = {'k1':111,'k2':222,'k3':333}
    res = d.keys()
    res1 = list(res)
    print(res1)
    ----------------------
    ['k1', 'k2', 'k3']
    

    Python 字典 values() 方法也返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有值。要将值存入列表的方法同上。

    d = {'k1':111,'k2':222,'k3':333}
    res1 = d.values()
    res1_iter = res1.__iter__()  # 返回值拥有__iter__方法。说明是一个可迭代对象
    print(res1,res1_iter)
    ------------------------------------------
    dict_values([111, 222, 333]) <dict_valueiterator object at 0x7f9c83043590>
    

    Python 字典 items() 方法也返回一个可迭代对象。也可以利用list方法转为字典,不过其中的值为元组

    d = {'k1':111,'k2':222,'k3':333}
    res1 = d.items()
    res1_iter = res1.__iter__()  # 返回值拥有__iter__方法。说明是一个可迭代对象
    print(res1,res1_iter)
    ------------------------------------
    dict_items([('k1', 111), ('k2', 222), ('k3', 333)]) <dict_itemiterator object at 0x7fb6ca2435e0>
    
    # 利用list方法
    res1 = list(res)
    print(res1)
    -----------------------------------
    [('k1', 111), ('k2', 222), ('k3', 333)]
    

  • 相关阅读:
    Android Studio无法预览xml布局之解决方法(两种)
    ssm web.xml配置解析
    ssm框架下实现文件上传
    spring mvc使用@InitBinder 标签对表单数据绑定
    Jquery实现相对浏览器位置固定、悬浮
    asp,php,jsp 不缓存网页的办法
    Spring 2.5
    ERROR 1366 (HY000): Incorrect string value: 'xB3xA4xC9xB3' for column
    DELPHI SOKET 编程--使用TServerSocket和TClientSocket
    SVN switch 用法总结
  • 原文地址:https://www.cnblogs.com/chiyun/p/14066247.html
Copyright © 2011-2022 走看看