zoukankan      html  css  js  c++  java
  • 我的python中级班学习之路(全程笔记第一模块) (第二章)(第3部分:元祖、哈希(hash)、字典、集合

    第二章                       数据类型    字符编码    文件操作

    第三部分

     第六节 :数据类型—元祖类型

    一、定义:元祖其实跟列表相似:也是一组字符串。不过它一旦创建便不能再修改,又称只读列表

     

    例:
    >>> names = ("shangnan","wenpeng","longyang","yilong","xiaotian",["liuqiang",22])
    >>> names
    ('shangnan', 'wenpeng', 'longyang', 'yilong', 'xiaotian', ['liuqiang', 22])    #创建元祖列表
    
     
    >>> names.index("yilong")            
    3
    >>> names[3] = 'xiaodong'             
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment                     #发现修改其中的值会报错说元祖类型不可修改
     
    >>> names [-1]
    ['liuqiang', 22]
    >>> names [-1][0] = 'linminglong'                                              #但是元祖内的包含的列表元素是可以修改的
    >>> names
    ('shangnan', 'wenpeng', 'longyang', 'yilong', 'xiaotian', ['linminglong', 22])
    >>>

    第七节     hash (哈希) 函数     (md5文件加密)

    用途:①文件签名,②md5加密:特征, 无法反解数据库的验证和(现在所有的网站登录密码,和写网页的源代码,都跟md5加密有关;典型的支付宝的用户验证)③密码验证:支付宝的数据库就是密文密码,无法反解(你在输入密码的时候,会被加密成密文和数据库的密文,能否登录取决于是否相等

    例:
    >>> hash('yilong')
    1988588325535353625                             #哈希字符串会返回加密文
    >> hash('1,4,5,')
    -8005653040755405875  
                       
    >>> hash(('A','C'))                             #哈希元祖类型
    -7870207913792714445
    
    >>> hash((['lingdong','mac'])
    SyntaxError: invalid syntax                     #哈希列表会报错,因为列表属于可变类型,而被哈希的必须是不可变的    

    第八节  : 数据类型—字典的特性和详细用法

        1.字典的特性:

     ***代码来两行验证下:

    例:
    >>> info = {
    ... '龙凤':[22,'公安',''],
    ... '刘强':[16,'出差d'],           #这就是完整的创建字典类型格式
    ... '包安':[18,'ddd'],
    ... }
    >>> info
    {'龙凤': [22, '公安', ''], '刘强': [16, '出差d'], '包安': [18, 'ddd']}   

           *****字典的特性重要的是必须可哈希:唯一的值不可重复,查找速度快是因为每输进去的字符串都被哈希成了数字串,

    2.字典的用法:

      *查询字典信息:

    例:
    {'龙凤': [22, '公安', ''], '刘强': [16, '出差d'], '包安': [18, 'ddd']}
    >>> info['刘强']         #跟查询列表索引一样格式,直接输入key
    [16, '出差d']

           **修改字典信息:

    例:
    >>> info
    {'龙凤': [22, '公安', ''], '刘强': [16, '出差d'], '包安': [18, 'ddd']}
    
    >>> info['龙凤'][2] = '商业'          #跟列表一样找到对应索引,直接赋值
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd']}
    >>>

    ***增加

    例:
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd']}
    
    >>> info['千峰'] = '22,'                 #可以单独增加
    >>> info 
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,'}
    
    >>> info['日本'] = [18,'东京']            #也可增加对应列表
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', '日本': [18, '东京']}
    >>>

          **************还有一种新的增加语法—批量增加****************

    例:
    >>> info
    {}
    >>> range(100)
    range(0, 100)
    >>> for i in range(100):
    ...   info[i] = i*i
    ...
    >>> info
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225, 16: 256, 17: 289, 18: 324, 19: 361, 20: 400, 21: 441, 22: 484, 23: 529, 24: 576, 25: 625, 26: 676, 27: 729, 28: 784, 29: 841, 30: 900, 31: 961, 32: 1024, 33: 1089, 34: 1156, 35: 1225, 36: 1296, 37: 1369, 38: 1444, 39: 1521, 40: 1600, 41: 1681, 42: 1764, 43: 1849, 44: 1936, 45: 2025, 46: 2116, 47: 2209, 48: 2304, 49: 2401, 50: 2500, 51: 2601, 52: 2704, 53: 2809, 54: 2916, 55: 3025, 56: 3136, 57: 3249, 58: 3364, 59: 3481, 60: 3600, 61: 3721, 62: 3844, 63: 3969, 64: 4096, 65: 4225, 66: 4356, 67: 4489, 68: 4624, 69: 4761, 70: 4900, 71: 5041, 72: 5184, 73: 5329, 74: 5476, 75: 5625, 76: 5776, 77: 5929, 78: 6084, 79: 6241, 80: 6400, 81: 6561, 82: 6724, 83: 6889, 84: 7056, 85: 7225, 86: 7396, 87: 7569, 88: 7744, 89: 7921, 90: 8100, 91: 8281, 92: 8464, 93: 8649, 94: 8836, 95: 9025, 96: 9216, 97: 9409, 98: 9604, 99: 9801}
    >>>

    **判断与获取:

    例:
    **判断
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', '日本': [18, '东京']}
    >>> '刘强' in info                      #判断名字是否在字典内
    True                                   #在返回True   不在返回False
    
    ***获取
    >>> info.get('日本')                    #第一种用法 get (常用语法,因为方便不会报错)(推荐)
    [18, '东京']
    
    >>> info.get('日本1')                   #如果没有什么不返回    
    >>> print(info.get('日本1'))            #看下结果
    None                                   #返回的英文意思是什么都没有
    ****第二种:
    >>> info['龙凤']
    [22, '公安', '商业']
    >>> info['龙凤1']                       #如果没有就会报错导致程序不能正常运行(不推荐)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: '龙凤1'                       

        *****清空、 删除:指定删、随机删以及全局删。

    例:
    >>> info
    {0: 2401, 50: 2500, 51: 2601, 52: 2704, 53:5555}
    {}                         #已清空

       **删除

    例:
    **指定删除
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', '日本': [18, '东京']}
    >>> info.pop('日本')                         #指定删除输入删除的 key
    [18, '东京']                                 #删除同时返回要删除的值
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,'}     #已被删除
    
    
    ***随机删
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> info.popitem()
    (2, 1)
    >>> info.popitem()
    (6, 1)
    >>> info.popitem()                        #随机删是无序的
    (8, 1)
    >>> info.popitem()
    ('千峰', '22,')
    >>> info.popitem()
    ('包安', [18, 'ddd'])
    >>> info.popitem()
    ('刘强', [16, '出差d'])
    >>> info.popitem()
    ('龙凤', [22, '公安', '商业'])             #字典删除完了会报错

    ***全局删:和列表一样,del

    例:>>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> del info['千峰']               #输入删除的key。
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], 8: 1, 6: 1, 2: 1}

     ****多级字典嵌套:就是字典里面套字典,查找和修的时候也是根据每一个 key一级一级找和修改

    2

          ********其他方法

    例:
    *copy(拷贝)
    >>> n2 = info.copy()            #拷贝 n2
    >>> n2
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    **返回字典 key (索引)
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> info.keys()              #返回 key 的语法
    dict_keys(['龙凤', '刘强', '包安', '千峰', 8, 6, 2])
    
    ***返回字典对应的 value  (值)3
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> info.values()           #返回 value 值得语法
    dict_values([[22, '公安', '商业'], [16, '出差d'], [18, 'ddd'], '22,', 1, 1, 1])
    
    ****把 key 和 value 变成元祖 放进列表内
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> info.items()
    dict_items([('龙凤', [22, '公安', '商业']), ('刘强', [16, '出差d']), ('包安', [18, 'ddd']), ('千峰', '22,'), (8, 1), (6, 1), (2, 1)])
    
    *****扩展(2合1)
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1}
    >>> n
    {11: 'aaa', 22: 'bb', 33: 'cc', '千峰': '22,'}
    
    >>> info.update(n)
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1, 11: 'aaa', 22: 'bb', 33: 'cc'}    #已经合并,重复的值覆盖,没有对应的自动生成
    ******查找与创建
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1, 11: 'aaa', 22: 'bb', 33: 'cc'}
    >>>
    >>> info.setdefault(8,19)      #找到 key 就会返回对应的值,不会修改
    1
    >>> info.setdefault('刘明','梁山')   #找不到 key 就会重新创建
    '梁山'
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1, 11: 'aaa', 22: 'bb', 33: 'cc', '刘明': '梁山'}
    
    *******生成字典并批量赋值
    >>> info.fromkeys(['a','b','c'],'dit')
    {'a': 'dit', 'b': 'dit', 'c': 'dit'}

    *最后**字典的循环**循环有2种方法

    例:
    *第一种:                  #常用循环方法
    >>> info
    {'龙凤': [22, '公安', '商业'], '刘强': [16, '出差d'], '包安': [18, 'ddd'], '千峰': '22,', 8: 1, 6: 1, 2: 1, 11: 'aaa', 22: 'bb', 33: 'cc', '刘明': '梁山'}
    >>> for k in info:
    ...     print(k,info[k])
    ...
    龙凤 [22, '公安', '商业']
    刘强 [16, '出差d']
    包安 [18, 'ddd']
    千峰 22,
    8 1
    6 1
    2 1
    11 aaa
    22 bb
    33 cc
    刘明 梁山
    
    
    第二种:
    >>> for k,v in info.items():          #低效的循环方法:因为需要先把字典变成列表再去循环,
    ...     print(k,v)
    ...
    龙凤 [22, '公安', '商业']
    刘强 [16, '出差d']
    包安 [18, 'ddd']
    千峰 22,
    8 1
    6 1
    2 1
    11 aaa
    22 bb
    33 cc
    刘明 梁山

    **************************字典、列表是以后只要写程序都会用到的东西,一定要熟悉******************************

    第九节   数据类型  —  集合    与 集合关系测试

    一、集合的特征与语法

       

     1.集合的语法:语法有两种

          ****下面一一验证下:

    例:
    *第一种:直接创建
    >>> s = {1,2,3,5,5,7,4,1,8,5}                 #集合语法,与字典相似,输入相同数值
    >>> s
    {1, 2, 3, 4, 5, 7, 8}                          #发现相同的已经覆盖,因为集合的特点就是去除重复的
    
    **第二种:其他类型转集合(列表、元祖)
    1.列表转集合
    >>> m = [1,4,7,2,5,6,3,2,1,4,7,9] >>> m [1, 4, 7, 2, 5, 6, 3, 2, 1, 4, 7, 9] >>> set(m) {1, 2, 3, 4, 5, 6, 7, 9} #转集合新语法,发现也覆盖重复数据 >>> k = set(m) >>> k {1, 2, 3, 4, 5, 6, 7, 9}

    2.元祖转集合

    >>> n = (1,7,8,5,4,12,3,9,2,5,8,4)
    >>> n
    (1, 7, 8, 5, 4, 12, 3, 9, 2, 5, 8, 4)
    >>> v = set(n)
    >>> v
    {1, 2, 3, 4, 5, 7, 8, 9, 12}

     2.集合的 增、删、改、查

        ****下面用代码验证下:

    例:
    1.增加与扩展
     * 增加
    >>> s
    {1, 2, 3, 4, 5, 7, 8}
    >>> s.add(5)                 #增加重复的值会被覆盖
    >>> s
    {1, 2, 3, 4, 5, 7, 8}
    >>> s.add(6)
    >>> s 
    {1, 2, 3, 4, 5, 6, 7, 8}     #要增加不重复的值
    
     ** 扩展(合并或增加多个值)
    >>> s
    {4,5, 6, 8}
    >>> s.update([1,2,3,5,6,8])  #可增加一个列表的值
    >>> s
    {1, 2, 3, 4, 5, 6, 8}
    
    2.随机删除,指定删除
     * 随机删
    >>> s
    {1, 2, 3, 4, 5, 6, 7, 8}
    >>> s.pop()                 #一般不用的语法
    1
    >>> s.pop()
    2
    >>> s.pop()               #注意:因为集合是无序的,所以他的随机删也是无序的
    3
    
     ** 指定删除分两种:
     * 指定删除:第一种
    >>> s
    {4,5,6,7,8}
    >>> s.remove(7)        #常用语法
    >>> s
    {4,5, 6, 8}
    
    **指定删除:第二种
    >>> s.discard(7)        #与上一种删除的区别是:上一种删除不存在的会报错,这一种有就删除,没有就略过,不会报错
    >>> s
    {4,5, 6, 8}
    
    3.清空
    >>> s
    {1, 2, 3, 5, 6, 8}
    >>> s.clear()
    >>> s
    set()

    二、集合的关系测试:集合的重点

    *****图例:

    1.交集与 差集

    交集、差集****代码验证

    例:
    1.交集(&>>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 5, 6, 7, 8, 9, -1}
    s
    >>> s&s2                      #语法(&)可以直接取出交集 (简单方便) 两个集合部分左右谁都可以 &
    {8, 5, 6}
    >>> s.intersection(s2)        #也是集合的语法,两个集合部分左右谁都可以 intersection
    {8, 5, 6}
    
    2.差集(->>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 5, 6, 7, 8, 9, -1}
    
    >>> s - s2                    #直接相减取差集,很方便
    {1, 2, 3}
    >>> s2 - s
    {0, 9, -1, 7}
    >>>
    >>> s.difference(s2)          #用语法取 s 与 s2 的差集
    {1, 2, 3} 
    >>> s2.difference(s)          #s2 与 s 的差集
    {0, 9, -1, 7}

    2.并集

    并集***代码验证

    例:
    >>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 5, 6, 7, 8, 9, -1}
    
    >>> s.union(s2)
    {0, 1, 2, 3, 5, 6, 7, 8, 9, -1}              #新语法谁都可以在前面,不分左右
    
    >>> s | s2
    {0, 1, 2, 3, 5, 6, 7, 8, 9, -1}              #(“|”称之为:管道符)简单快捷的语法,不分左右

    3.对称差集

      对称差集***代码验证

    例:
    >>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 5, 6, 7, 8, 9, -1}
    
    >>> s.symmetric_difference(s2)         #新语法:取出两者不相交的总和,不分左右
    {0, 1, 2, 3, 7, 9, -1}
    >>> s ^s2                              # (^ )简单快捷的语法,不分左右
    {0, 1, 2, 3, 7, 9, -1}

    4.超集与子集:包含关系   

    超集与子集 以及其他方法****代码验证

    例:  
    1.判断是否不相交
    >>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 1, 2, 3, 5, 6, 7, 8, 9, -1}
    >>> s2.isdisjoint(s)               #判断是否不相交
    False   
    
    2.判断是否为对方的子集或父集                     
    >>> s
    {1, 2, 3, 5, 6, 8}
    >>> s2
    {0, 1, 2, 3, 5, 6, 7, 8, 9, -1}
    
    >>> s2.issuperset(s)               #判 s2 是否是 s 的父集
    True
    >>> s.issuperset(s2)               #相反判断
    False
    
    >>> s2.issubset(s)                 #判断 s2 是否是 s 的子集
    False
    >>> s.issubset(s2)                 #相反判断
    True
    
    **便捷方法
    **(>=/<=>>> s2>=s                          #( >= / <= )简单便捷的方法
    True
    >>> s<=s2 
    True
    
    3.其他方法
    >>> s.difference_update(s2)    #把不相交的值赋给一方
    >>> s
    {11, -4}
    >>> s2
    {0, 1, 2, 3, 5, 6, 7, 8, 9, -1} 
  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/guoyilong/p/9898315.html
Copyright © 2011-2022 走看看