zoukankan      html  css  js  c++  java
  • 20201019-Python学习笔记8

    dict :全称dictionary,在其他语言中也称为map,使用键 - 值 (key-value)存储,具有极快的查找速度。

    示例:如果用list实现根据学生名字查找对应成绩,需要两个list,先在名字list中找到,然后再查找对应成绩list,找到后取出成绩,这样花费的时间较长。

    用dict实现,只需要一个“名字-成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。

    >>> d = {'maike':99,'bob':70,'mali':68}
    >>> d['maike']
    99
    >>> d['mali']
    68
    >>>

    这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

    把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

    >>> d = {'maike':99,'bob':70,'mali':68}
    >>> d['maike']
    99
    >>> d['mali']
    68
    >>> d['mali'] = 100
    >>> d['mali']
    100
    >>> d['maike'] = 80
    >>> d['maike']
    80
    >>>
    

    不存在key,会报错

    >>> d['opo']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'opo'
    >>>

    两种判断方法:

    1、通过in方式判断key是否存在

    >>> 'zhangsan' in d
    False
    >>> 'mali' in d
    True
    >>> 'maike' in d
    True
    >>>
    

    2、通过dict提供的get()方法,如果key不存在,返回none为空,或者自己指定的value

    >>> d.get('mali')
    100
    >>> d.get('lisi')
    >>> d.get('wangwu',-1)
    -1
    >>>
    

    要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

    >>> d.pop('mali')
    100
    >>> d
    {'maike': 80, 'bob': 70}
    >>>
    

    dict内部存放的顺序和key放入的顺序没有关系

    两者对比特点

    dict特点:

    查找和插入的速度很快,不会随着key的增加而变慢

    需要占用大量的内存,内存浪费较多

    list特点:

    查找和插入的时间随着元素的增多而增多

    占用空间小,浪费内存少

    dict的key必须是不可变对象

    这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

    要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

    set:和dict类似,set是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

    要创建一个set,需要提供一个list作为输入集合

    >>> s = set([1,2,3,4,5])
    >>> s
    {1, 2, 3, 4, 5}
    >>>
    

     传入的参数[1,2,3,4,5]是一个list,而显示的{1,2,3,4,5}只是告诉你这个set中有12345这五个元素,显示的顺序不表示set是有序的  

    重复元素在set中会被自动过滤

    >>> s = set([1,1,2,3,4,5,4,3])
    >>> s
    {1, 2, 3, 4, 5}
    >>>

    通过add(key)方法可以添加元素到set中,也可以重复添加,但不会有效果

    >>> s.add(3)
    >>> s
    {1, 2, 3, 4, 5}
    >>> s.add(3)
    >>> s
    {1, 2, 3, 4, 5}
    >>> s.add(7)
    >>> s
    {1, 2, 3, 4, 5, 7}
    >>>

    通过remove(key)方法可以删除元素:

    >>> s.remove(4)
    >>> s
    {1, 2, 3, 5, 7}
    >>> s.remove(5)
    >>> s
    {1, 2, 3, 7}

    set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作

    >>> s1 = set ([1,2,3])
    >>> s2 = set ([2,3,4])
    >>> s1 & s2
    {2, 3}
    >>> s1 | s2
    {1, 2, 3, 4}
    >>>
    

    set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”

  • 相关阅读:
    3d角色模型 制作 全过程 。3d max 。3d role model making process.3d Max
    Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial
    unity3d 给游戏添加音源 Unity3d adds a sound source to the game
    安卓 运行、调试 配置 android Run/debug configurations
    Gradle 同步 已经开始 Gradle sync started
    更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools
    [Educational Codeforces Round 16]A. King Moves
    他们在军训,我在搞 OI(一)
    [POJ1383]Labyrinth
    [POJ1157]LITTLE SHOP OF FLOWERS
  • 原文地址:https://www.cnblogs.com/lookmefly/p/13841083.html
Copyright © 2011-2022 走看看