zoukankan      html  css  js  c++  java
  • 五、字典

      列表:通过标号访问各个值。

      通过名名称来访问各个值得数据结构。这种数据结构成为映射。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元祖(不可变类型)。

    创建和使用字典

      字典由及其相对应的组成,这种键-值对称为(item).每个键与其值之间都用冒号(:)分割,项之间用(,)分割,而整个字典放在花括号内。空字典用俩个花括号表示。类似于:{}。

    >>> phone_book = {'hanmeimei':666, 'lilei':888}
    

      PS:在字典(以及其他的映射类型中),键必须是独一无二的,而字典的值无需如此。

    函数dict(类)

      可以使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。 

    >>> items = [('name', 'lilei'), ('age', 13)]
    >>> d = dict(items)
    >>> d 
    {'name': 'lilei', 'age': 13}
    >>> d1
    {'name': 'hanmeimei', 'age': 18}
    >>> d2 = dict('name'='hanmeimei', 'age'=18) #有人跟我一样傻吗
      File "<stdin>", line 1
    SyntaxError: keyword can't be an expression
    

      

    基本的字典操作

      字典的很多行为在很多方面都类似于序列。

    •   len(d)返回字典d包含的项(键-值对)数。
    •    d[k]返回与K键相关联的值。
    •   d[k] = v 将值v关联到键k。
    •   del d[k] 删除键为k的项。
    •   k in d 检查字典d是否包含键为k的项。

    虽然字典和列表有很多相同之处,但也有不同的地方。

    • 键的类型  键的类型:键可以是整数、浮点数、字符串和元祖等不可变类型。
    • 自动添加  即使字典中原本没有的键,也可以给它赋值。这将在字典中创建一个新项。然而不通过append等方法就不能给列表中没有的元素赋值。
    • 成员资格  k in d (其中d是一个字典)查找的是键,而不是值,而 v in l(l是一个列表)查找的是值而不是索引。

    PS:相比检查列变是否包含指定的值,检查字典是否包含指定的键效率更高。数据结构越大,效率差距越大。

    将字符串格式设置功能用于字典

    在有些情况下,通过在字典中存储一系列命名的值,可让格式设置更容易。为此,可以使用format_map来指初你将通过一个映射来提供所需的信息。

    >>> phonebook = {'lilei':666, 'hanmeimei':888}
    >>> "Lilei's phone numbers is {lilei}.".format_map(phonebook)
    "Lilei's phone numbers is 666."

    字典的方法

    clear

    方法clear删除所有的字典项,这种操作就地执行,因此什么也不返回。

    >>> phonebook = {'lilei':666, 'hanmeimei':888}
    >>> phonebook.clear()
    >>> phonebook
    {}
    

     # 有点晕

    >>> x = {}
    >>> y = x
    >>> x['key'] = 'value'
    >>> y 
    {'key': 'value'}
    >>> x = {}
    >>> y
    {'key': 'value'}
    >>> 
    >>> 
    >>> x = {}
    >>> y = x
    >>> x['key'] = 'value'
    >>> y 
    {'key': 'value'}
    >>> x.clear()
    >>> y
    {}
    

     copy

      方法copy返回一个新字典,其包含的键-值对与原来的字典相同(这方法是执行的浅赋值,因为值本身是原件,而非副本)

    >>> x = {'name':'root', 'obj':['mysql', 'nginx', 'tomcat']}
    >>> y = x.copy()
    >>> y['name'] = 'ubuntu'
    >>> x
    {'name': 'root', 'obj': ['mysql', 'nginx', 'tomcat']}
    >>> y['obj'].remove('nginx')
    >>> y
    {'name': 'ubuntu', 'obj': ['mysql', 'tomcat']}
    >>> x
    {'name': 'root', 'obj': ['mysql', 'tomcat']}
    

      当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值。

     为避免这个问题,一种办法时执行深复制,即同时复制值及其包含的所有值。为此,可以使用模块copy中的函数deepcopy.

    >>> from  copy import deepcopy
    >>> d = {}
    >>> d['names'] = ['root', 'ubuntu']
    >>> c = d.copy()
    >>> dc = deepcopy(d)
    >>> d['names'].append('admin')
    >>> c
    {'names': ['root', 'ubuntu', 'admin']}
    >>> dc
    {'names': ['root', 'ubuntu']}
    

    fromkeys

    方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None.

     

    >>> {}.fromkeys(['name','age'])
    {'name': None, 'age': None}
    

      可以不这么做,而是直接对dict(前面说过,dict是所有字典所属的类型。)调用方法fromkeys.

    >>> dict.fromkeys(['name','age'])
    {'name': None, 'age': None}
    

     如果不想使用默认值None,可提供特定的值。

    >>> dict.fromkeys(['name','age'], 'Flase')
    {'name': 'Flase', 'age': 'Flase'}
    >>> dict.fromkeys(['name','age'], ['Flase', 'True'])
    {'name': ['Flase', 'True'], 'age': ['Flase', 'True']}
    

     get

    方法get。访问字典中没有的项的时候,将引发异常。

    >>> d = {}
    >>> print(type(d))
    <class 'dict'>
    >>> print(d['name'])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'name'
    

     而使用get不会这样,而是返回None,你可指定‘默认值’,这样将返回你指定的默认值而不是None。

    >>> d = {}
    >>> d.get('name','空空如也')
    '空空如也'
    

     如果字典包含指定的键,get的作用将于普通字典查找相同。

     

    >>> d = {'name':'root'}
    >>> d.get('name','空空如也')
    'root'
    >>> 
    

      items

      方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)形式。字典的项在列表中排列顺序不确定。

    >>> d = {'name':'root', 'version':7.2}
    >>> d.items()
    dict_items([('name', 'root'), ('version', 7.2)])
    

      返回值属于一种为字典视图的特殊类型。字典视图可用于迭代,还可以确定其长度以及对其执行成员资格检查。

    >>> d.items()
    dict_items([('name', 'root'), ('version', 7.2)])
    >>> it = d.items()
    >>> len(it)
    2
    >>> ('name', 'root') in it
    True
    

      视图的一个优点是不复制,它们始终事底层字典的反映,即便你修改了底层字典亦如此。

    >>> d
    {'name': 'root', 'version': 7.2}
    >>> d['app'] = 'nginx'
    >>> ('app', 'nginx') in it
    True
    

      keys

    方法keys返回一个字典的视图,其中包含指定字典中的键。

    >>> d.keys()
    dict_keys(['name', 'version', 'app'])
    

      pop

    方法pop可用于获取与指定键相关联的值,并讲该键-值对从字典中删除。是有返回值的(返回被删除的键相对应的值)。

    >>> d = {'x':1, 'y':2}
    >>> d.pop('x')
    1
    >>> d
    {'y': 2}
    

      popltems

    方法popitems类似与list.pop。但不是弹出最后一个元素,而是随机弹出一个字典项,因为字典项的顺序是不确定的。

    >>> d
    {'x': 1, 'y': 2, 'z': 3}
    >>> d.popitem()
    ('z', 3)
    >>> d.popitem()
    ('y', 2)
    >>> d.popitem()
    ('x', 1)
    >>> d.popitem()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'popitem(): dictionary is empty'
    

      PS:如果希望字典有序,请使用 模块collections中的OrderedDict类。

    setdefault

    方法setdefault类似于get,它也获取指定键相关联的值,除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键值对。

    如果键值对存在,就返回键对应的值

    >>> d = {}
    >>> d.setdefault("name",'root')
    'root'
    >>> d.setdefault("name",'ubuntu')
    'root'
    

     如果不给值,会使用None

    >>> d.setdefault("age")
    >>> d
    {'name': 'root', 'age': None}
    

     update

    方法update使用一个字典中的项来更新另一个字典。

     

    >>> d
    {'name': 'root', 'age': None}
    >>> x = {'name':'ubuntu'}
    >>> d.update(x)
    >>> d
    {'name': 'ubuntu', 'age': None}
    

      对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它。

    values

    方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复值。

    小结

    •  映射:映射让你能够使用任何不可变的对象(最常用的是字符串和元祖)来标识其元素。Python只有一种内置的映射类型,那就是字典。
    •  将字符串格式功能用于字典:要对字典执行字符串格式设置操作,不能使用format和命名参数,而必须使用format_map.
    •  字典方法:字典有很多方法,这些方法的调用方式与列表和字符串的方法相同。

    函数

    dict 从键-值对、映射或关键字参数创造字典

  • 相关阅读:
    命令安装mongod作为服务启动
    npm命令
    win服务
    win进程操作
    【数据结构与算法之美】7.排序算法之冒泡、选择、插入
    【leetcode】23.合并K个排序链表
    【leetcode】141.环形链表
    【数据结构与算法之美】6.环形队列
    【数据结构与算法之美】5.基于链表实现队列
    【数据结构与算法之美】4.基于数组实现队列
  • 原文地址:https://www.cnblogs.com/kongzhou/p/9016998.html
Copyright © 2011-2022 走看看