zoukankan      html  css  js  c++  java
  • 使用dict和set


    dict

      1、python内置了字典: dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度,创建一个dict有以下三种方法:

    >>>d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}     # 注意是花括号和list不一样
    >>>d = dict([('Michael', 95), ('Bob', 75), ('Tracy', 85)])
    >>>d = dict(Michael=95, Bob=75, Tracy=85)
    >>>d['Michael']
    95
    
    >>> {x: x**2 for x in (2, 4, 6)}
    {2: 4, 4: 16, 6: 36}
    

      把数据放入dict的方法,除了初始时指定外,还可以通过key放入,不过由于一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉:

    >>>d['Jack'] = 90
    >>>d['Jack']
    90
    >>>d['Jack'] = 88
    >>>d['Jack']
    88
    

      注意: 如果key不存在,dict就会报错。
      2、避免key不存在的错误: 有两种方法,一是通过in判断key是否存在:

    >>>'Thomas' in d
    False
    

      二是通过dict提供的get()函数 ,如果key不存在,可以返回None,或者自己制定的value:

    >>>d.get('Thomas')          # 注意:返回None的时候python的交互命令行不显示结果
    >>>d.get('Thomas', -1)
    -1                             
    

      3、删除key: 要删除一个key,用pop(key)函数 或者del语句 ,对应的value也会从dict中删除:

    >>>d.pop('Bob')
    >>>del d['Bob']     # 和上面pop()效果一样   dict内部存放的顺序和key放入的顺序是没有关系的。
    75
    >>>d
    {'Michael': 95, 'Tracy': 85}
    

      4、可以将dict中的所有key以list形式来获取:

    >>> tel = {'jack': 4098, 'sape': 4139}
    >>> list(tel.keys())
    ['irv', 'guido', 'jack']
    >>> sorted(tel.keys())            # 可以对keys进行排序并以list形式返回
    ['guido', 'irv', 'jack'] 
    

      4、dict和list比较:

      和list比较,dict有以下几个特点:
       1、查找和插入的速度极快,不会随着key的增加而变慢。
       2、需要占用大量的内存,内存浪费多。
      而list相反:
       1、查找和插入的时间随着元素的增加而增加。
       2、占用空间小,内存浪费很少。   
      小结: dict是用空间来换取时间的一种方法,dict可以用在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是:dict的key必须是不可变的对象

    set

      1、基本概念: set和dict类似,也是一组key的集合 ,但不存储value。在set中,没有重复的key ,并且key是无序的 。创建set可以使用一对花括号或者使用set()函数

    >>>s = set(123)
    >>>s = {123}    #与上面set()效果一样
    >>>s
    {1, 2, 3}    # 注意是花括号
    

      注意: 创建一个空集合的时候必须使用set()而非{}(创建一个空的dict时使用{})。
      2、方法:

      add(key): 添加元素到set中,可以重复添加,但不会有效果( 重复的元素在set中会自动被过滤):

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

      remove(key): 可以删除元素:

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

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

    >>> a = set('abracadabra')
    >>> b = set('alacazam')
    >>> a                                  # unique letters in a
    {'a', 'r', 'b', 'c', 'd'}
    >>> a - b                              # letters in a but not in b
    {'r', 'd', 'b'}
    >>> a | b                              # letters in a or b or both
    {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
    >>> a & b                              # letters in both a and b
    {'a', 'c'}
    >>> a ^ b                              # letters in a or b but not both
    {'r', 'd', 'b', 'm', 'z', 'l'}
    

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

    不可变对象

      1、基本概念: 前面有说过,str是不变对象,而list是可变对象
      对于可变对象, 比如list,对list进行操作,list内部的内容是会变化的,比如:

    >>>a = ['c', 'b', 'a']
    >>>a.sort()
    >>a
    ['a', 'b', 'c']
    

      而对于不可变对象, 比如str,对str进行操作呢:

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

      虽然字符串有个replace()方法,也确实变出了'Abc',但是变量a最后仍是'abc',应该怎么理解呢?我们先把代码改成下面这样:

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

      要始终牢记的是:a是变量,而'abc'才是字符串对象! 有些时候,我们经常说,对象a的内容是'abc',但其实是指,a本身是一个变量,它指向的对象的内容才是'abc':

      当我们调用a.replace('a', 'A')时,实际上调用replace是作用在字符串对象'abc'上的,而这个方法虽然名字叫replace,但却没有改变字符串'abc'的内容。相反,replace方法创建了一个新字符串'Abc'并返回,如果我们用变量b指向该新字符串,就容易理解了。

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

      总结: 使用key-value结构存储的dict在python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。

  • 相关阅读:
    MVC(一)
    C# 泛型(二)
    C# 泛型(一)
    ASP.NET MVC Razor
    ASP.NET 服务端接收Multipart/form-data文件
    centos(网易163)软件源更换
    xshell中文乱码问题
    centos7修改主机名
    sqlalchemy python中的mysql数据库神器
    mysql 更新与查询(排序 分组 链接查询)
  • 原文地址:https://www.cnblogs.com/xipuhu/p/7456613.html
Copyright © 2011-2022 走看看