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)]
    

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/chiyun/p/14066247.html
Copyright © 2011-2022 走看看