zoukankan      html  css  js  c++  java
  • 字典操作

    一、字典基础

    1、创建字典

    一个字典通过一对大括号进行创建,键值之间使用(:)进行分隔,每一对键值之间使用(,)分隔,如果大括号中无值那么就是空字典;它是Python中唯一具有映射关系的数据类型,效率高于列表。

     d = {"name":"bright",12:["jskfj",23]}  #键唯一且为不可变数据类型

    当然如果键值不唯一,也不会抛出异常,只不过相同的键会被覆盖掉。

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}  #键唯一且为不可变数据类型
    print(d)
    
    #-----------------------------------------输出———————————————
    {12: ['jskfj', 23], 'name': 'gh'}

     2、dict函数

    可以使用dict函数通过其它映射进行字典的创建

    items=[('name','张三'),['iphone',1872563541]]
    d=dict(items)
    print(d) #{'name': '张三', 'iphone': 1872563541}

    可以看出,为dict函数传入一个列表,而列表的元素就是一个个的列表或者元组,元素中包含两个值,第一个值表示了字典的键,第二个值表示字典的值。

    另外dict也可以通过关键字传参,创建字典。

    d=dict(name='张三',iphone=1872563541)
    print(d) #{'iphone': 1872563541, 'name': '张三'}

    如果dict函数不指定任何参数,就会创建一个空字典

    d=dict()
    print(d)#{}

    二、字典的基本操作

    1、len(dict)

    返回字典中元素(键值对)的个数

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    print(len(d))#2

    2、dict[key]

    #获取键对应的值
    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    result=d["name"]
    print(result)#gh
    
    #对键进行赋值
    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    d["name"]="root"
    print(d)#{12: ['jskfj', 23], 'name': 'root'}

     3、del dict[key]

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    del d["name"]
    print(d)#{12: ['jskfj', 23]}

    4、key in dict

    判断dict中是否含有键为key的项

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    print("name" in d)#True

    5、字典格式化字符串

    在字符串的格式化中,已经有很多方法了,这里也可以通过字典进行格式化,引进format_map()方法。

    定义格式化参数字典:

    data={
        "name":"bright",
        "age":27,
        "hobby":"music"
    }

    定义字符串模板:

    str="""
    
    {name} is a boy,{age} years old,liking {hobby}.
    
    """

    使用format_map()方法格式化字符串:

    print(str.format_map(data))#bright is a boy,27 years old,liking music.

    6、序列与迭代

    (1)获取字典中的key

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    for key in d:
        print(key)
    ######输出######
        12
        name

    (2)获取字典中的key和value

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    for key,val in d.items():
        print(key,val)
        
    #########输出######
        12 ['jskfj', 23]
        name gh

     (3)并行迭代

    同时迭代多个序列,可以使用range函数获取索引的范围,然后使用for循环进行迭代,注意多个序列一般元素个数相同。

    schools=['beida','fudan','shifan']
    citys=['北京','上海','天津']
    for  i in range(len(schools)):
        print(schools[i],citys[i])
    ##########输出########
        beida 北京
        fudan 上海
        shifan 天津

    (4)压缩序列

     使用zip函数将两个或多个序列的对应元素做为一个元组放到一起,如果压缩的两个或多个序列元素个数不相等,以元素个数最少的为准。

    schools=['beida','fudan','shifan']
    citys=['北京','上海','天津']
    print(zip(schools,citys))
    print(type(zip(schools,citys)))
    for i in zip(schools,citys):
        print(i)
    ############输出###########
        <zip object at 0x0000000005220D08>
        <class 'zip'>
        ('beida', '北京')
        ('fudan', '上海')
        ('shifan', '天津')

    (5)反转序列迭代

    通过reversed函数对一个序列进行反转

    citys=['北京','上海','天津']
    result=reversed(citys)
    print(result)
    for i in result:
        print(i)
    ###########输出##########
        <list_reverseiterator object at 0x00000000054657B8>
        天津
        上海
        北京

    7、其它

    • 键类型

    字典的键可以是任意不可变类型,例如,元组、字符串等,而列表的key也就是index必须是整数类型。

    • 自动添加

    字典可以通过dict[key]=value进行添加新元素,而列表必须通过append()或insert()方法进行添加新元素。

    • key in dict

    字典中查找的仅仅是字典的key,而列表中查找的是value,而非index.

    三、字典方法

    class dict(object):
        """
        dict() -> new empty dictionary
        dict(mapping) -> new dictionary initialized from a mapping object's
            (key, value) pairs
        dict(iterable) -> new dictionary initialized as if via:
            d = {}
            for k, v in iterable:
                d[k] = v
        dict(**kwargs) -> new dictionary initialized with the name=value pairs
            in the keyword argument list.  For example:  dict(one=1, two=2)
        """
        def clear(self): # real signature unknown; restored from __doc__
            """ D.clear() -> None.  Remove all items from D. """
            pass
    
        def copy(self): # real signature unknown; restored from __doc__
            """ D.copy() -> a shallow copy of D """
            pass
    
        @staticmethod # known case
        def fromkeys(*args, **kwargs): # real signature unknown
            """ Returns a new dict with keys from iterable and values equal to value. """
            pass
    
        def get(self, k, d=None): # real signature unknown; restored from __doc__
            """ D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None. """
            pass
    
        def items(self): # real signature unknown; restored from __doc__
            """ D.items() -> a set-like object providing a view on D's items """
            pass
    
        def keys(self): # real signature unknown; restored from __doc__
            """ D.keys() -> a set-like object providing a view on D's keys """
            pass
    
        def pop(self, k, d=None): # real signature unknown; restored from __doc__
            """
            D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
            If key is not found, d is returned if given, otherwise KeyError is raised
            """
            pass
    
        def popitem(self): # real signature unknown; restored from __doc__
            """
            D.popitem() -> (k, v), remove and return some (key, value) pair as a
            2-tuple; but raise KeyError if D is empty.
            """
            pass
    
        def setdefault(self, k, d=None): # real signature unknown; restored from __doc__
            """ D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
            pass
    
        def update(self, E=None, **F): # known special case of dict.update
            """
            D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
            If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
            If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
            In either case, this is followed by: for k in F:  D[k] = F[k]
            """
            pass
    
        def values(self): # real signature unknown; restored from __doc__
            """ D.values() -> an object providing a view on D's values """
            pass
    
        def __contains__(self, *args, **kwargs): # real signature unknown
            """ True if D has a key k, else False. """
            pass
    
        def __delitem__(self, *args, **kwargs): # real signature unknown
            """ Delete self[key]. """
            pass
    
        def __eq__(self, *args, **kwargs): # real signature unknown
            """ Return self==value. """
            pass
    
        def __getattribute__(self, *args, **kwargs): # real signature unknown
            """ Return getattr(self, name). """
            pass
    
        def __getitem__(self, y): # real signature unknown; restored from __doc__
            """ x.__getitem__(y) <==> x[y] """
            pass
    
        def __ge__(self, *args, **kwargs): # real signature unknown
            """ Return self>=value. """
            pass
    
        def __gt__(self, *args, **kwargs): # real signature unknown
            """ Return self>value. """
            pass
    
        def __init__(self, seq=None, **kwargs): # known special case of dict.__init__
            """
            dict() -> new empty dictionary
            dict(mapping) -> new dictionary initialized from a mapping object's
                (key, value) pairs
            dict(iterable) -> new dictionary initialized as if via:
                d = {}
                for k, v in iterable:
                    d[k] = v
            dict(**kwargs) -> new dictionary initialized with the name=value pairs
                in the keyword argument list.  For example:  dict(one=1, two=2)
            # (copied from class doc)
            """
            pass
    
        def __iter__(self, *args, **kwargs): # real signature unknown
            """ Implement iter(self). """
            pass
    
        def __len__(self, *args, **kwargs): # real signature unknown
            """ Return len(self). """
            pass
    
        def __le__(self, *args, **kwargs): # real signature unknown
            """ Return self<=value. """
            pass
    
        def __lt__(self, *args, **kwargs): # real signature unknown
            """ Return self<value. """
            pass
    
        @staticmethod # known case of __new__
        def __new__(*args, **kwargs): # real signature unknown
            """ Create and return a new object.  See help(type) for accurate signature. """
            pass
    
        def __ne__(self, *args, **kwargs): # real signature unknown
            """ Return self!=value. """
            pass
    
        def __repr__(self, *args, **kwargs): # real signature unknown
            """ Return repr(self). """
            pass
    
        def __setitem__(self, *args, **kwargs): # real signature unknown
            """ Set self[key] to value. """
            pass
    
        def __sizeof__(self): # real signature unknown; restored from __doc__
            """ D.__sizeof__() -> size of D in memory, in bytes """
            pass
    
        __hash__ = None
    dict类

    1、clear()

    清空字典中的所有元素

    d = {"name":"bright",12:["jskfj",23],"name":"gh"}
    d.clear()
    print(d)#{}

    2、copy()与deepcopy()

    copy()方法复制的字典只是浅复制,复制的是第一层的字典数据。也就是说修改原字典还是新字典,对应的元素都会改变。

    d = {"name":"bright",12:["jskfj",23]}
    d1=d.copy()
    print(d1)
    print(d)
    
    ############输出###########################
        {12: ['jskfj', 23], 'name': 'bright'}
        {12: ['jskfj', 23], 'name': 'bright'}

    修改原字典中的值:

    d = {"name":"bright",12:["jskfj",23]}
    d1=d.copy()
    d["name"]="alb"
    print(d1)
    print(d)
    
    #################输出################
        {12: ['jskfj', 23], 'name': 'bright'}
        {12: ['jskfj', 23], 'name': 'alb'}

    修改copy后新字典中的值:

    d = {"name":"bright",12:["jskfj",23]}
    d1=d.copy()
    d1["name"]="sjp"
    print(d1)
    print(d)
    
    ###############输出###################
    {12: ['jskfj', 23], 'name': 'sjp'}
    {12: ['jskfj', 23], 'name': 'bright'}

    修改第二层数据:

    d = {"name":"bright",12:["jskfj",23]}
    d1=d.copy()
    d[12][0]=56
    print(d)
    print(d1)
    
    ################输出###############
    {12: [56, 23], 'name': 'bright'}
    {12: [56, 23], 'name': 'bright'}

    从上面可以看到修改第二层数据,无论是修改新字典还是原字典,另外一个字典的值都会改变,如果想改变这种情况,就需要进行深拷贝。

    from copy import deepcopy
    d = {"name":"bright",12:["jskfj",23]}
    d1=deepcopy(d)
    d[12][0]=78
    print(d)
    print(d1)
    ###################输出##################
        {12: [78, 23], 'name': 'bright'}
        {12: ['jskfj', 23], 'name': 'bright'}

    3、fromkeys()

    用于根据key建立新的字典,该方法的返回值就是新的字典。在新的字典中所有的key都有相同的默认值None,不过可以根据fromkeys方法的第二个参数进行指定默认值。

    #在新字典上调用fromkeys创建新的字典,通过列表指定key
    dic={}.fromkeys(['name','age','hobby'])
    print(dic) #'hobby': None, 'age': None, 'name': None}

     #通过元组指定key
     dic={}.fromkeys(('name','age','hobby'))
     print(dic) #'hobby': None, 'age': None, 'name': None}

    通过fromkeys的第二个参数指定默认值

    dic={}.fromkeys(('name','age','hobby'),'bx')
    print(dic) #{'hobby': 'bx', 'age': 'bx', 'name': 'bx'}

    4、get()

    获取对应key的value,使用dict[key]可以获取值,但是一旦key不存在就会抛出异常,get()方法就不会抛出异常,如果key不存在,会返回None值。当然也可以通过get的第二个参数指定传入的默认值。

    d = {"name":"bright",12:["jskfj",23]}
    print(d.get("name"))#bright
    print(d.get("age"))#None

    5、items()与keys()

    在字典的基本操作中已经说明了这两种方法,items方法用于获取字典的key-value,返回值是一个可迭代的dict_items类型;keys方法用于返回字典中所有的key,是dict_keys类型,也是可迭代的。

    d = {"name":"bright",12:["jskfj",23]}
    result1=d.items()
    result2=d.keys()
    print(type(result1))
    for key,val in result1:
        print(key,val)
    print(type(d.keys()))
    for key in result2:
        print(key)
        
    #########输出############
    <class 'dict_items'>
    12 ['jskfj', 23]
    name bright
    
    <class 'dict_keys'>
    12
    name

    6、pop()和popitem()

    pop方法和popitem方法用于弹出字典中的元素,pop方法用于获取指定的key的值,并从字典中弹出这个key-value,popitem方法用于返回最后一个key-value,并且弹出这对key-value。

    #pop方法
    dict={'name':'xiaoli','depart':'xiaoshou','age':27} print(dict.pop('name'))#xiaoli print(dict)#{'age': 27, 'depart': 'xiaoshou'} #popitem方法 dict={'name':'xiaoli','depart':'xiaoshou','age':27} print(dict.popitem())#('age', 27) print(dict)#{'name': 'xiaoli', 'depart': 'xiaoshou'}

    7、setdefault()

    setdefault方法用于设置key的默认值,该方法接收两个参数,第一个表示key,第二个表示默认值,如果key在字典中不存在,那么就会向字典中添加key,并用第二个参数作为值(参数未指定就为None),如果字典中已经存在key,setdefault不会修改key原来的值,而且该方法会返回原来的值。

    dict={}
    dict.setdefault("name","menb")
    dict.setdefault("name","niko")
    dict.setdefault("age")
    print(dict)
    
    ##############输出########
    {'age': None, 'name': 'menb'}

    其实这个方法与dict[key]=value差不多,但是这个方法可以添加元素,但是不能修改元素,因为已经存在的key,它只会返回不会修改,而dict[key]=value既可以添加又可以修改。

    8、update()

    update方法用于一个字典中的元素更新另外一个字典。该方法接收一个参数,该参数表示用作更新数据的字典的数据源。列如:

    d1.update(d2)

    将d2中的元素更新到d1中,如果d2中的key-value对在d1中不存在,就会在d1中新添加key-value对,如果d2中的key在d1中已经存在,那么就会把d2中的key的value更新给d1中key的value。

    d1={"name":"bright","age":27,"hobby":"music"}
    d2={"name":"sansha","city":"陕西"}
    d1.update(d2)
    print(d1)#{'city': '陕西', 'hobby': 'music', 'age': 27, 'name': 'sansha'}

    该方法试讲两个列表进行合并,当然还有其它方法,使用dict(dict1,**dict2):

    >>> dict1 = {'name':'bright','age':28}
    >>> dict2 = {'identified':'worker'}
    >>> dict(dict1,**dict2)
    {'age': 28, 'name': 'bright', 'identified': 'worker'}

    9、values()

    获取字典中的值,返回的是dict_values类型,是可迭代的。它与keys方法返回的有一点不一样就是,它返回的值得列表可以有重复的,而keys()方法返回的都是唯一值的列表。

    dict={"name":"bright","age":27,"hobby":"music"}
    result=dict.values()
    print(type(result))
    for val in result:
        print(val)
    ##########输出###########
        <class 'dict_values'>
        music
        27
        bright

    四、总结

    对字典操作最多的无非就是增、删、查、改这些基本操作,现在就对这些基本操作总结一下。

     d = {"name":"bright",12:["jskfj",23]}
    
    # #查
     print(d["name"])
     print(d.get("name",None)) #推荐
    
    ##增加
    # d["age"] = "123"
    # d.default("age","123")
     print(d)
    
    #修改
    # d["name"] = "zhangfei"
    
    #删除
    # ret = d.pop(12)
    # del d[12]
    # print(ret)
    
    ##更新
     d1 = {"name":"alia",12:["jskfj",23]}
     d2 =  {"name":"megon",12:["jskfj",23],"age":32}
     d2.update(d)
     print(d2)
  • 相关阅读:
    svg圆弧进度条demo
    canvas圆弧、圆环进度条实现
    angularjs与pagination插件实现分页功能
    CSS布局:居中的多种实现方式
    新闻滚动demo
    移动端rem设置字体
    angularjs自定义指令通用属性详解
    浅谈angularjs绑定富文本出现的小问题
    jquery.validate使用攻略(表单校验)
    Typescript 享元模式(Flyweight)
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11002218.html
Copyright © 2011-2022 走看看