zoukankan      html  css  js  c++  java
  • python 基础-使用list(列表)、dict、set、可变与不可变对象

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448

    dict是字典,可以储存键值对类型的值,set与dict相同,只是set只储存key值,而不储存value。

    补充:

      python中数值类型(int、float)、元组str是不可变对象,而列表list、字典dict、集合set是可变对象

      list.cout('a')查看list中'a'的个数

    >>> l
    ['a', 2]
    >>> l.count('a')
    

    List

      问题:list index out of range 和 list assignment index out of range的原因

    >>> a=[[],[],[1]]
    >>> a[0][-1]=5
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list assignment index out of range#是再下标溢出的情况下依旧分配值的时候出现的异常
    >>> a[0][-1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range#是访问的下标超出了list的地址
    >>> a[0][1]=5
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list assignment index out of range
    >>> a[0][1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    >>>
    

      

    dict

      

    a={'sex':'nan'}
    >>> 'sex' in a#默认在key中检查
    True
    >>> 'nan' in a
    False
    >>> 'sex' in a.values()
    False
    >>> 'nan' in a.values()
    True
    >>> 'sex' in a.keys()
    True
    >>>
    

      

      dict又称map,他以键值对的形式储存数据,并且为了查找方便,在存储数据的时候,会根据key的值去计算应该放置的位置。为了保证计算位置的算法的结果不冲突,所以就要求dict数据的key值不能重复。由于这种特性,使得在查找数据时,与list的从头开始查找相比,dict中储存的数据查找时极快的,但是对空间有些浪费,因为常规情况下的带储存数据经过算法处理后,并不会无间隔的紧密的按顺序放置在内存中,而是分散的。

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

      dict的key必须是不可变对象,因为dict内使用hash计算key存放的位置,如果每次计算相同的key得出的结果不同,就会造成key的混乱,如果用可变对象当作key,会报错

    >>> key = [1, 2, 3]
    >>> d[key] = 'a list'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    

      

    dict的一些方法和特性

      一个key只能对应一个value

      可以通过in判断是否存在(只匹配key,不匹配value)

    >>> l={'a':'1','b':'2'}
    >>> 'a' in l     
    True             
    >>> '1' in l     
    False            
    

      还可以通过 get() 方法获取指定key的内容,若key不存在,返回None,或者返回自己指定的内容

    >>> l.get('a')
    '1'
    >>> l.get('1')#返回None
    >>> l.get('1',aaa)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'aaa' is not defined#因为必须写“aaa”
    >>> l.get('1',1111)
    1111
    >>>
    

      使用 pop(key) 方法删除指定的key值

      使用remove()删除list中的index

      参考链接:https://blog.csdn.net/u013066730/article/details/85260764

      使用dict一定要注意,dict的key一定是不可变对象,在Python中,字符串、整数等都是不可变的,而list是可变的。

    list与dict的区别:

      两者之间的区别主要在于查找速度和对储存的使用率上面

      1)list的查找速度会随着存放数据的数量的增加而增加,但占用的内存小,浪费内存还小。

      2)dict的查找速度极快,不会受存放数据数量大小的影响,但占用内存大,浪费空间多。

    set

       set 和dict类似,也是一组 key 的集合,但不储存 value ,同样的key不能重复。

      使用一个list作为输入创建set

    >>> s=set([1,2,'a'])#注意创建时传入的参数是一个list
    >>> s
    {1, 2, 'a'}#这样显示并不代表set是有序的
    >>> s=set([1,2,'a','a']) 
    >>> s 
    {1, 2, 'a'} #不重复
    >>>
    

      使用 add(key) 添加 key 到 set 中

    >>> s.add('b')
    >>> s.add('a')#重复添加没有效果
    >>> s
    {1, 2, 'a', 'b'}
    

      使用 romove(key) 删除

     set 可以看作为数学意义上的一个集合,这个集合中的元素是无序的、是不重复的,可以做数学意义上的交集、并集操作。

    >>> b=set([3,4,'d'])
    >>> s&b#交集
    set()
    >>> b
    {'d', 3, 4}
    >>> s|b#并集
    {1, 2, 'a', 3, 4, 'b', 'd'}
    >>>
    

      不能添加可变元素,注意:tuple虽然是不可变元素,但是包含可变元素的tuble也不行

    >>> b.add([5,6])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    AttributeError: 'tuple' object has no attribute 'add'
    >>> b.add((1,2,[3,4]))#tuple中包含了可变元素list
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>>
    

      

       

    可变与不可变对象

      不可变对象就是虽然看起来对他的改变会生效,是因为其返回一个新的对象。如

    >>> a = 'abc'
    >>> b = a.replace('a', 'A')
    >>> b
    'Abc'
    >>> a
    'abc'
    

      而可变对象如 list 

    >>> l=[1,2]
    >>> l
    [1, 2]
    >>> l[0]='a'
    >>> l
    ['a', 2]
    >>>
    

      

      所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

     

      

     

  • 相关阅读:
    Scala for the Impatients---(1)Basics
    2.2 Markov Chain
    2.1 Monte Carlo Integration
    1.2 Sampling From Non-standard Distribution
    1.1 Built-in Distributions In Matlab
    Design Pattern -- Builder
    Java Dynamic proxy
    The Difference Between Keypoints and Descriptors
    gcc -l option vs. -L option: The difference
    Stationarity and Independence of Data
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10951707.html
Copyright © 2011-2022 走看看