• 字典(当索引不好用时)


      列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。在本节中,将介绍一种通过名字引用值得数据结构。这种类型的数据结构称为映射(mapping)。字典是Python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但都是存储在一个特定的键(key)下。键可以是数字、字符串甚至是元组。

    字典

    字典的特性:

      dict是无序的

      key是唯一的,故天生去重

      注意:字典中的键是唯一(其他类型的映射也如此),而值并不唯一。

      查询速度快,比列表快多了

      为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?

      哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法

      dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。

    创建和使用字典

    创建一个字典

    >>> student={"name":"Mike",'age':23}
    >>> student
    {'age': 23, 'name': 'Mike'}
    View Code

    也可以用dict函数,通过其他映射(比如其他字典)或者(键,值)对的序列建立字典:

    >>> items=[('name','Mike'),('age',42)]
    >>> d=dict(items)
    >>> d
    {'age': 42, 'name': 'Mike'}
    View Code

    dict函数也可以通过关键字参数来创建字典:

    >>> d=dict(name='Mike',age=23)
    >>> d
    {'age': 23, 'name': 'Mike'}
    View Code

    基本字典操作

    字典的基本操作在很多方面与序列(sequence)类似:

    方法 说明
    len(d) 返回d中项的数量(键值对)
    d[k] 返回关联到键k上的值
    d[k]=v 将值v关联到键k上
    del d[k] 删除键为k的项

    k in d

    检查d中是否含有键为k的项

    注意:在字典中检查键的成员资格比在列表中检查值的成员资格更高效,数据结构规模越大,两者的效率差距越明显。

    字典的格式化字符串:

      在每个转换说明符(conversion specifier)中的%字符后面,可以加上键(用圆括号括起来),后面再跟上其他说明元素:

    >>> info={'name':'Mike','age':23,'job':'IT','salary':10000}
    >>> "%(name)s is %(age)s and his job is %(job)s."%info
    'Mike is 23 and his job is IT.'
    View Code

    字典方法

    >>> info
    {'job': 'IT', 'name': 'Mike', 'salary': 10000}
    >>> info['address']='广东'
    >>> info
    {'job': 'IT', 'name': 'Mike', 'salary': 10000, 'address': '广东'}
    View Code

    {'job': 'IT', 'name': 'Mike', 'salary': 10000, 'address': '广东'}
    >>> info['salary']=12000
    >>> info
    {'job': 'IT', 'name': 'Mike', 'salary': 12000, 'address': '广东'}
    View Code

    clear

      clear方法清除字典中所有的项。这是个原地操作(类似于list.sort),所以无返回值(或者返回值为None)

    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike', 'salary': 10000}
    >>> returned_value=info.clear()
    >>> info
    {}
    >>> print(returned_value)
    None
    View Code

    fromkeys

      fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。

    >>> {}.fromkeys(['name','age'])
    {'age': None, 'name': None}
    
    #通过dict方法
    >>> dict.fromkeys(['job','salary'])
    {'job': None, 'salary': None}
    
    #自定义初始value
    >>> dict.fromkeys(['job','salary'],'(unknow)')
    {'job': '(unknow)', 'salary': '(unknow)'}
    View Code

    查:(get方法)

      一般来说,如果试图访问字典中不存在的项是会报错,get方法是个更宽松的访问字典项的方法,当使用get方法访问一个不存在的键时,没有任何异常,而得到None值,还可以自定义“默认”值,替换None:

    #不用get
    >>> info={'name':'Mike','age':23,'job':'IT','salary':10000}
    >>> info['address']
    Traceback (most recent call last):
      File "<pyshell#40>", line 1, in <module>
        info['address']
    KeyError: 'address'
    
    #使用get
    >>> info.get('name')
    'Mike'
    >>> print(info.get('address'))
    None
    >>> print(info.get('address','不存在'))
    不存在
    View Code

    items

      items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式,但是项的返回时并没有遵循特定的次序:

    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike', 'salary': 10000}
    >>> info.items()
    dict_items([('age', 23), ('job', 'IT'), ('name', 'Mike'), ('salary', 10000)])
    View Code

    keys:keys方法将字典中的键一列表的形式返回:

    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike', 'salary': 10000}
    >>> info.keys()
    dict_keys(['age', 'job', 'name', 'salary'])
    View Code

    values:一列表的形式返回字典中的值,返回值的列表中可以包含重复的元素

    :(pop、popitem、del)  

      pop方法用来获得对应于给定键的值,然后将这个键-值对从字典删除:

    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike', 'salary': 10000}
    >>> info.pop('salary')
    10000
    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike'}
    View Code

      popitem方法(随机删)类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitem弹出随机的项,因为字典是无序的。(该方法用首先获取键的列表)

    >>> info
    {'age': 23, 'job': 'IT', 'name': 'Mike'}
    >>> info.popitem()
    ('age', 23)
    >>> info
    {'job': 'IT', 'name': 'Mike'}
    View Code

    setdefault

      setdefault方法在某种程度上类似于get方法,能够获得与给定值相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。

    >>> d={}
    >>> d.setdefault('name','待定')
    '待定'
    >>> d
    {'name': '待定'}
    >>> d['name']='Jack'
    >>> d
    {'name': 'Jack'}
    View Code

    update

      update方法可以利用一个字典更新另一个字典:

    >>> info
    {'job': 'IT', 'name': 'Mike', 'salary': 8000}
    >>> new_salary={'salary':10000}
    >>> info.update(new_salary)
    >>> info
    {'job': 'IT', 'name': 'Mike', 'salary': 10000}
    View Code

      提供的字典中的项会被添加到旧的字典只能怪,若有相同的键则会覆盖。update方法可以使用与调用dict函数(或者类型构造函数)同样的方式进行调用。这就意味着update可以和映射、拥有(键,值)对的队列(以及其他可迭代对象)以及关键字参数一起调用。

    遍历字典

    >>> dict={
        'name':'Mike',
        'age':'18',
        'sex':"",
    }
    >>> for i in dict: #高效
        print(i,dict[i])
     
    sex 男
    age 18
    name Mike
    
    #低效   items会把先字典变成一个列表,当数据量很大时,转换的时间自然就拉长了
    >>> for i, v in dict.items():
        print( i , v)
    
        
    sex 男
    age 18
    name Mike
    View Code
  • 相关阅读:
    Windows 平台下的Mysql集群主从复制
    IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
    【2013625】K2+SAP集成应用解决方案在线研讨会
    to_char 和 to_date 经验分享
    Java向Access插入数据
    spring Bean的生命周期管理
    [置顶] 30分钟,让你成为一个更好的程序员
    Spring框架中Bean的生命周期
    Box2D的相关知识
    第八周项目二
  • 原文地址:https://www.cnblogs.com/freely/p/6284482.html
Copyright © 2020-2023  润新知