zoukankan      html  css  js  c++  java
  • 第四章 散列类型的方法

    # 第四章 散列类型的方法
    ## 一、Dictionary(字典)
    ### 1、字典定义
      字典定义:字典是Python中唯一的映射类型(哈希表)
      - 字典对象是可变的,但是字典的键必须使用不可变对象,程序需要通过 key 来访问 value,因此字典中的 key 不允许重复,并且一个字典中可以使用不同类型的键值。
      - key()或者values()返回键列表或者值列表。
      - items()返回包含键值对的元组。
    ### 2、创建字典
      - 1、直接使用{}花括号创建字典
    ##### 在使用花括号语法创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开,多个 key-value 对之间用英文逗号隔开。
    ```python
    >>> d1={'name':'Tom','age':18,'gender':'male'}
    >>> d1['name']    //通过指定键输出对应值
    'Tom'
      
    >>> a=1
    >>> d2={a:111,'b':'two'}    //字典中的键,可以使用字符串,数字,元组,还可以使用变量
    >>> d2
    {1: 111, 'b': 'two'}
    ```
      - 2、使用构造函数创建字典 - dict
    #####  使用 dict() 函数创建字典时,可以传入多个列表或元组参数作为 key-value 对,每个列表或元组将被当成一个 key-value 对,因此这些列表或元组都只能包含两个元素。
    ```python
    >>> a=dict()
    >>> a = dict(name='tom',age=15)    #使用关键字参数来创建字典,其key不需要加双引号
    >>> a['name']
    'tom'
    >>> fruit=[('apple', 10), ('banana',8), ('pear',3)]    # 创建包含3组key-value对的字典
    >>> dict1=dict(fruit)
    >>> print(dict1)
    {'apple': 10, 'banana': 8, 'pear': 3}
    ```
    ## 二、 Set(集合)
    ### 1、集合定义
      集合定义:set是一个无序且不重复的元素集合。set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此set也有如下特性:不重复和元素为不可变对象。
      - 集合是一个可变容器
      - 集合内的数据对象都是唯一的(不能重复)
      - 集合是无序的存储结构,集合内的数据没有先后关系
      - 集合是可迭代对象
      - 集合相当于是只有键没有值得字典(键就是集合中的数据)
      - 集合内的元素是不可变的
    ### 2、创建集合
      创建集合:
      - 1.使用直接量创建集合,注意:使用直接量不能创建空集合
    ```python
    >>> se={1,2,3}    #se={value},value类型:string、tuple、数字等不可变类型
    >>> type(se)
    <class 'set'>
    >>> s={'hello',1.23,True,(12)}
    >>> type(s)
    <class 'set'>
    ```
      - 2.使用构造函数创建集合 - set
    ```python
    >>> s = set() #创建空集合
    >>> s = set("ABC")
    >>> s
    {'A','B','C'}
    >>> se = set([1,0,3.14,"hello"]) # s = {1,0,3.14,'hello'}
    >>> se
    {0, 1, 3.14, 'hello'}
    ```
      - 3、利用dict创建,将会使用dict中的key值作为set的值
    ```python
    >>> d=set({'d1':'v1','d2':'v2'})
    >>> print(d)
    {'d1', 'd2'}
    ```
      
      
    ## 三、散列类型的方法
    ### 1、字典方法
       1)增
      - a=di.copy()   字典的浅复制
      - a.setdefault('a')   有则查,无则增,增的值为;none
      - a=fromkeys     给定的多个 key 创建字典,这些 key 对应的 value 默认都是 None;也可以额外传入一个参数作为默认的 value。
    ```python
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> cars=car.copy()    #复制新的对象cars
    >>> print(cars)
    {'dress': 88, 'skirt': 58, 'shirt': 68}
    >>> print(car.setdefault('coat',128))    #新增一个键值对
    128
    >>> print(car)
    {'dress': 88, 'skirt': 58, 'shirt': 68, 'coat': 128}
    >>> print(car.setdefault('dress',58))    #如果key在dict中存在,不会修改dict内容
    88
    >>> print(car)
    {'dress': 88, 'skirt': 58, 'shirt': 68, 'coat': 128}
     
    ```
      2)删
    - clear(),用于清空字典中所有的 key-value 对,对一个字典执行 clear() 方法之后,该字典就会变成一个空字典。
    - pop(),  获取指定 key 对应的 value,并删除这个 key-value 对。
    - popitem(), 由于字典存储 key-value 对的顺序是不可知的,因此开发者感觉字典的 popitem() 方法是“随机”弹出的,但实际上字典的 popitem() 方法总是弹出底层存储的最后一个 key-value对。
    - del 字典对象, 删除字典对象, 如:del car
    ```python
    #clear方法
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> car.clear()
    >>> print(car)
    {}
    #pop方法
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> print(car.pop('dress'))
    88
    >>> print(car)
    {'skirt': 58, 'shirt': 68}
    #popitems方法
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> print(car.popitem())
    ('shirt', 68)
    >>> print(car)
    {'dress': 88, 'skirt': 58}
    ```
      3)改
    - update  更新字典 ,如果被更新的字典中己包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去。
    ```python
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> car.update({'dress':98,'coat':168})
    >>> print(car)
    {'dress': 98, 'skirt': 58, 'shirt': 68, 'coat': 168}
    ```
      4)查
    - get   根据 key 来获取 value,它相当于方括号语法的增强版,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;但如果使用 get() 方法访问不存在的 key,该方法会简单地返回 None,不会导致错误。
    - keys  查看所有的键
    - values 查看所有的值
    - items  查看所有的键值
    ```python
    # get方法
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> print(car.get('skirt'))    #get('键'),如果键存在,返回对应的值
    58
    >>> print(car.get('coat'))    #如果键不存在,返回None
    None
    >>> print(car[coat])    #如果键不存在,不使用get方法,则报错。
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'coat' is not defined
    # items方法
    >>> car={'dress':88,'skirt':58,'shirt':68}
    >>> it=car.items()  
    >>> print(type(it))      #返回dict_items对象
    <class 'dict_items'>
    >>> print(list(it))      #将dict_items转换成列表
    [('dress', 88), ('skirt', 58), ('shirt', 68)]
    >>> print(list(it)[1])    #访问第2个key-value对
    ('skirt', 58)
    # keys方法
    >>> ke=car.keys()  
    >>> print(type(ke))    #返回dict_keys对象
    <class 'dict_keys'>
    >>> print(list(ke))    #将dict_keys转换成列表
    ['dress', 'skirt', 'shirt']
    >>> print(list(ke)[1])    #访问第2个key
    skirt
    #values方法
    >>> val=car.values()
    >>> print(type(val))    #返回dict_values对象
    <class 'dict_values'>
    >>> print(list(val)[1])    #访问第2个value
    58
    ```
      程序调用字典的 items()、keys()、values() 方法之后,都需要调用 list() 函数将它们转换为列表,这样即可把这三个方法的返回值转换为列表。
      
      5)字典格式化字符串
      
      在格式化字符串时,如果要格式化的字符串模板中包含多个变量,后面就需要按顺序给出多个变量,这种方式对于字符串模板中包含少量变量的情形是合适的,但如果字符串模板中包含大量变量,这种按顺序提供变量的方式则有些不合适。可改为在字符串模板中按 key 指定变量,然后通过字典为字符串模板中的 key 设置值。
    ```python  
    # 字符串模板中使用key
    >>> temp = '教程是:%(name)s, 价格是:%(price)010.2f, 出版社是:%(publish)s'
    >>> book = {'name':'Python基础教程', 'price': 99, 'publish': 'C语言中文网'}
    # 使用字典为字符串模板中的key传入值
    >>> print(temp % book)
    教程是:Python基础教程, 价格是:0000099.00, 出版社是:C语言中文网
    >>> book = {'name':'C语言小白变怪兽', 'price':159, 'publish': 'C语言中文网'}
    # 使用字典为字符串模板中的key传入值
    >>> print(temp % book)
    教程是:C语言小白变怪兽, 价格是:0000159.00, 出版社是:C语言中文网
    ```
    ### 2、集合方法
     
      1)增
      - add()
    ```python
    >>> se={'apple','banana','pear'}
    >>> se.add('cherry')
    >>> print(se)    #集合无序性,随机插入某个位置
    {'apple', 'cherry', 'banana', 'pear'}
    ```  
      2)删
      - pop()     删除为无序删除,而不是有序从后面删除的
      - discard() 移除不存在的元素不会报错
      - remove()  移除不存在的元素会报错
      - clear()   删除全部内容
    ```python
    >>> se = {11, 22, 33}
    >>> se.discard(11)
    >>> se.discard(44)  # 移除不存的元素不会报错
    >>> print(se)
    {33, 22}
    #其他方法可以动手操作,去理解这些方法
    ```  
      3)改
      - update()   
    ```python
    >>> se = {11, 22, 33}
    >>> be = {22,44,55}
    >>> se.update(be)  # 把se和be合并,得出的值覆盖se
    >>> print(se)
    {33, 22, 55, 11, 44}
    >>> se.update([66, 77])  # 可增加迭代项
    >>> print(se)
    {33, 66, 22, 55, 11, 44, 77}
    ```
      4)查
      
    无法通过下标索引
      5)集合操作
      
      集合的运算:交集,并集和差集
      - 交集  成两个集合的交集(两个集合的共同部分)
      - 并集  生成两个集合的并集
      - 差集  生成属于se,但不属于st的所有元素的集合
      - '>'   判断一个集合是另一个集合的超集
      - '-'   判断一个集合是另一个集合的子集
      - ==    判断集合相同
      - !=   判断集合不同
     
    ```python
    >>> se={11,22,33,44}
    >>> st={22,44,66,88}
    >>> se&st
    {44, 22}
    >>> se|st
    {33, 66, 11, 44, 22, 88}
    >>> se-st
    {33, 11}
    >>> s1 = {1,2,3}
    >>> s2 = {2,3}
    >>> s1 > 2s   # s1为s2的超集
    True
    >>> s2 < s1   # s2为s1的子集
    True
    >>> s1 = {1,2,3}
    >>> s2 = {2,3,1}
    >>> s1 == s2 # 相同为True
    True
    >>> s1 != s1 #两个对象不相同为True,相同为False
    False
    ```  
    ## 四、课堂练习
      - 1、有字典 dic = {"k1": "v1", "k2": "v2", "k3": "v3"},实现以下功能:
      
        1、输出字典 dic 中所有的key
        
        2、输出字典 dic 中所有的value
        
        3、添加一个键值对"k4","v4",输出添加后的字典 dic
        
        4、删除字典 dic 中的键值对"k1","v1",并输出删除后的字典 dic
        5、删除字典 dic 中 'k5' 对应的值,若不存在,使其不报错,并返回None
      - 2、经理有:曹操,刘备,孙权, 技术员有:曹操,孙权,张飞, 关羽。
      用集合求:
         1. 即是经理也是技术员的有谁?
         2. 是经理,但不是技术人员的都有谁?
         3. 是技术人员,但不是经理的人都有谁?
         4. 张飞是经理吗?
         5. 身兼一职的人都有谁?
         6. 经理和技术人员共有几个人?   
    ## 五、上一节课堂练习答案
    - 1、创建一个变量,并赋给它一个列表(含数值,文本),进行切片取值,并进行增删改查的操作。
    ```python
    >>> li=[12,34,'tom','Jon','Merry','Lili','是我好盆友']
    >>> li[2:6]    #取出里面四位好盆友
    ['tom', 'Jon', 'Merry', 'Lili']
    >>> li[-2:-6:-1]
    ['Lili', 'Merry', 'Jon', 'tom']
    >>> li[2:6:2]
    ['tom', 'Merry']
    >>> li.append('!')    #在列表最后增加一个元素
    >>> print(li)
    [12, 34, 'tom', 'Jon', 'Merry', '是我好盆友', '!']
    >>> li.remove('Merry')    #删除一位小盆友
    >>> print(li)
    [12, 34, 'tom', 'Jon', 'Jerry', '是我好盆友', '!']
    >>> li[4]='Ella'    #指定索引位置插入一个小盆友
    >>> print(li)
    [12, 34, 'tom', 'Jon', 'Ella', '是我好盆友', '!']
    >>> li.index('tom')  #查看'tom'在哪个索引位置下
    2
    ```
    - 2、创建三个字符串对象,值分别是'Hello'、'My name'和'is tom',用学过的拼接方法去完成拼接结果为'Hello,My name is tom'
    ```python
    >>> st1='Hello'
    >>> st2='My name'
    >>> st3='is tom'
    >>> str=st1+'!'+' '+st2+' '+st3+'!'    #需要加上空格和叹号,合并为一条规范的英语句子
    >>> print(str)
    Hello! My name is tom!
    >>> str='%s! %s %s!'%(st1,st2,st3)    #通过%s和%拼接
    >>> print(str)
    Hello! My name is tom!
    >>> '{}! {} {}!'.format(st1,st2,st3)    #通过.format和{}
    'Hello! My name is tom!'
    ```
     
     
     
    `
      
     
      
      
      
      
    如有问题请留言,谢谢!
  • 相关阅读:
    OO设计精要:封装,还是封装(有感于“Why getter and setter methods are evil ”by Allen Holub )
    博客园建议:能否记住在博客园的首页上只显示标题
    戴尔国际英语
    C#代码契约(转)
    C#数组传递和返回
    SecureString
    里氏替换原则
    ASP.NET的Cache(转)
    WCF服务
    C#枚举中的位运算权限分配
  • 原文地址:https://www.cnblogs.com/yunsi/p/13183179.html
Copyright © 2011-2022 走看看