zoukankan      html  css  js  c++  java
  • python学习笔记(6)

    第6章 组合数据类型

    组合类型的三种表达形式:集合序列字典

    集合类型及操作

    定义:集合是多个元素的无序组合

    • 集合类型与数学中的集合概念一致
    • 集合元素之间无序,每个元素唯一,不存在相同元素
    • 集合元素不可更改,不能是可变数据类型
    • 集合用大括号 {} 表示,元素间用逗号分隔
    • 建立集合类型用 {} 或 set()
    • 建立空集合类型,必须使用set() ( ps:这点要与字典区分开来,字典建立空字典是用{ } )
    >>> A = {"python", 123, ("python",123)} #使用{}建立集合
    {123, 'python', ('python', 123)}
    >>> B = set("pypy123") #使用set()建立集合
    {'1', 'p', '2', '3', 'y'}
    >>> C = {"python", 123, "python",123}
    {'python', 123}
    
    

    集合操作符
    6个操作符

    操作符及应用 描述
    S T
    S - T 差,返回一个新集合,包括在集合S但不在T中的元素
    S & T 交,返回一个新集合,包括同时在集合S和T中的元素
    S ^ T 补,返回一个新集合,包括集合S和T中的非相同元素
    S <= T 或 S < T 返回True/False,判断S和T的子集关系
    S >= T 或 S > T 返回True/False,判断S和T的包含关系

    4个增强操作符

    操作符及应用 描述
    S = T
    S -= T 差,更新集合S,包括在集合S但不在T中的元素
    S &= T 交,更新集合S,包括同时在集合S和T中的元素
    S ^= T 补,更新集合S,包括集合S和T中的非相同元素

    e.g.

    >>> A = {"p", "y" , 123} 
    >>> B = set("pypy123")
    >>> A-B                                         
    {123} 
    >>> B-A
    {'3', '1', '2'}
    >>> A&B               
    {'p', 'y'} 
    >>> A^B      
    {'2', 123, '3', '1'}
    >>> A|B              
    {'1', 'p', '2', 'y', '3', 123}
    
    

    集合处理方法

    操作函数或方法 描述
    S.add(x) 如果x不在集合S中,将x增加到S
    S.discard(x) 移除S中元素x,如果x不在集合S中,不报错
    S.remove(x) 移除S中元素x,如果x不在集合S中,产生KeyError异常
    S.clear() 移除S中所有元素
    S.pop() 随机返回S的一个元素,更新S,若S为空产生KeyError异常
    S.copy() 返回集合S的一个副本
    len(S) 返回集合S的元素个数
    x in S 判断S中元素x,x在集合S中,返回True,否则返回False
    x not in S 判断S中元素x,x不在集合S中,返回True,否则返回False
    set(x) 将其他类型变量x转变为集合类型
    >>> A = {"p", "y" , 123} 
    >>> for item in A:
                   print(item, end="")
    p123y
    >>> A
    {'p', 123, 'y'}
    >>> try:
               while True:
                     print(A.pop(), end=""))
          except: 
                pass
    p123y
    >>> A
    set()
    

    集合类型应用场景
    包含关系比较

    >>> "p" in {"p", "y" , 123}
    True
    >>> {"p", "y"} >= {"p", "y" , 123}
    False
    

    数据去重:集合类型所有元素无重复 (集合类型的最大特点就是数据去重)

    >>> ls = ["p", "p", "y", "y", 123]
    >>> s = set(ls)    # 利用了集合无重复元素的特点
    {'p', 'y', 123}
    >>> lt = list(s) # 还可以将集合转换为列表
    ['p', 'y', 123]
    

    序列类型及操作

    定义:序列是具有先后关系的一组元素

    • 序列是一维元素向量,元素类型可以不同
    • 类似数学元素序列: s0, s1, … , sn-1
    • 元素间由序号引导,通过下标访问序列的特定元素

    序列是一个基类类型

    序号的定义

    序列类型通用操作符
    6个操作符

    操作符及应用 描述
    x in s 如果x是序列s的元素,返回True,否则返回False
    x not in s 如果x是序列s的元素,返回False,否则返回True
    s + t 连接两个序列s和t
    sn 或 ns 将序列s复制n次
    s[i] 索引,返回s中的第i个元素,i是序列的序号
    s[i: j] 或 s[i: j: k] 切片,返回序列s中第i到j以k为步长的元素子序列

    e.g.

    >>> ls = ["python", 123,".io"] 
    >>> ls[::-1]
    ['.io', 123, 'python']
    >>> s = "python123.io"
    >>> s[::-1]
    'oi.321nohtyp'
    

    序列类型通用函数和方法
    5个函数和方法

    函数和方法 描述
    len(s) 返回序列s的长度,即元素个数
    min(s) 返回序列s的最小元素,s中元素需要可比较
    max(s) 返回序列s的最大元素,s中元素需要可比较
    s.index(x) 或s.index(x, i, j) 返回序列s从i开始到j位置中第一次出现元素x的位置
    s.count(x) 返回序列s中出现x的总次数

    e.g.

    >>> ls = ["python", 123, ".io"] 
    >>> len(ls)
    3
    >>> s = "python123.io"
    >>> max(s)
    'y'
    

    元组类型及操作

    定义:元组是序列类型的一种扩展

    • 元组是一种序列类型,一旦创建就不能被修改
    • 使用小括号 () 或 tuple() 创建,元素间用逗号 , 分隔
    • 可以使用或不使用小括号

    e.g.

    >>> creature = "cat", "dog","tiger","human"
    >>> creature 
    ('cat', 'dog', 'tiger', 'human')
    >>> color = (0x001100, "blue", creature)
    >>> color
    (4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
    

    元组类型操作
    元组继承序列类型的全部通用操作

    • 元组继承了序列类型的全部通用操作
    • 元组因为创建后不能修改,因此没有特殊操作
    • 使用或不使用小括号

    e.g.

    >>> creature = "cat", "dog","tiger","human"
    >>> creature[::-1] 
    ('human', 'tiger', 'dog', 'cat') 
    >>> color = (0x001100, "blue", creature)
    >>> color[-1][2]
    'tiger'
    

    列表类型及操作

    定义:列表是序列类型的一种扩展,十分常用

    • 列表是一种序列类型,创建后可以随意被修改
    • 使用方括号 [] 或list() 创建,元素间用逗号 , 分隔
    • 列表中各元素类型可以不同,无长度限制

    e.g.

    >>> ls = ["cat", "dog","tiger", 1024]
    >>> ls
    ['cat', 'dog', 'tiger', 1024] 
    >>> lt = ls
    >>> lt
    ['cat', 'dog', 'tiger', 1024]
    

    注:方括号 [] 真正创建一个列表,赋值仅传递引用

    列表类型操作函数和方法

    函数或方法 描述
    ls[i] = x 替换列表ls第i元素为x
    ls[i: j: k] = lt 用列表lt替换ls切片后所对应元素子列表
    del ls[i] 删除列表ls中第i元素
    del ls[i: j: k] 删除列表ls中第i到第j以k为步长的元素
    ls += lt 更新列表ls,将列表lt元素增加到列表ls中
    ls *= n 更新列表ls,其元素重复n次

    e.g.

    >>> ls = ["cat", "dog","tiger", 1024]
    >>> ls[1:2] = [1, 2, 3, 4]
    ['cat', 1, 2, 3, 4, 'tiger', 1024]
    >>> del ls[::3]
    [1, 2, 4, 'tiger']
    >>> ls*2
    [1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
    
    函数或方法 描述
    ls.append(x) 在列表ls最后增加一个元素x
    ls.clear() 删除列表ls中所有元素
    ls.copy() 生成一个新列表,赋值ls中所有元素
    ls.insert(i,x) 在列表ls的第i位置增加元素x
    ls.pop(i) 将列表ls中第i位置元素取出并删除该元素
    ls.remove(x) 将列表ls中出现的第一个元素x删除
    ls.reverse() 将列表ls中的元素反转

    e.g.

    >>> ls = ["cat", "dog","tiger", 1024]
    >>> ls.append(1234)
    ['cat', 'dog', 'tiger', 1024, 1234] 
    >>> ls.insert(3, "human")
    ['cat', 'dog', 'tiger', 'human', 1024, 1234]
    >>> ls.reverse()
    [1234, 1024, 'human', 'tiger', 'dog', 'cat']
    

    序列类型应用场景
    数据表示:元组 和 列表

    • 元组用于元素不改变的应用场景,更多用于固定搭配场景
    • 列表更加灵活,它是最常用的序列类型
    • 最主要作用:表示一组有序数据,进而操作它们

    元素遍历
    for item in ls :
    <语句块>
    for item in tp :
    <语句块>

    数据保护

    • 如果不希望数据被程序所改变,转换成元组类型
    >>> ls = ["cat", "dog","tiger", 1024]
    >>> lt = tuple(ls)
    >>> lt
    ('cat', 'dog', 'tiger', 1024)
    

    实例9: 基本统计值计算

    • 需求:给出一组数,对它们有个概要理解
    • 该怎么做呢?
      总个数、求和、平均值、方差、中位数…
    #CalStatisticsV1.py
        def getNum():       #获取用户不定长度的输入
            nums = []
            iNumStr = input("请输入数字(回车退出): ")
            while iNumStr != "":
                nums.append(eval(iNumStr))
                iNumStr = input("请输入数字(回车退出): ")
            return nums
         
        def mean(numbers):  #计算平均值
            s = 0.0
            for num in numbers:
                s = s + num
            return s / len(numbers)
         
        def dev(numbers, mean): #计算方差
            sdev = 0.0
            for num in numbers:
                sdev = sdev + (num - mean)**2
            return pow(sdev / (len(numbers)-1), 0.5)
         
        def median(numbers):    #计算中位数
            sorted(numbers)
            size = len(numbers)
            if size % 2 == 0:
                med = (numbers[size//2-1] + numbers[size//2])/2
            else:
                med = numbers[size//2]
            return med
         
        n =  getNum() #主体函数
        m =  mean(n)
        print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))
    

    字典类型及操作

    定义:理解“映射”,字典类型是“映射”的体现

    • 映射是一种键(索引)和值(数据)的对应

    注:序列类型由0..N整数作为数据的默认索引 , 而映射类型则由用户为数据定义索引

    • 键值对:键是数据索引的扩展
    • 字典是键值对的集合,键值对之间无序
    • 采用大括号{}和dict()创建,键值对用冒号: 表示
      {<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>}

    字典类型的用法
    在字典变量中,通过键获得值
    <字典变量> = {<键1>:<值1>, … , <键n>:<值n>}
    <值> = <字典变量>[<键>] 或者 <字典变量>[<键>] = <值>
    [ ] 用来向字典变量中索引或增加元素

    e.g.

    >>> d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
    >>> d 
    {'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
    >>> d["中国"]
    '北京'
    >>> de = {} ; type(de)
    <class 'dict'>
    

    :type(x) 返回变量x的类型

    字典处理函数及方法

    函数或方法 描述
    del d[k] 删除字典d中键k对应的数据值
    k in d 判断键k是否在字典d中,如果在返回True,否则False
    d.keys() 返回字典d中所有的键信息
    d.values() 返回字典d中所有的值信息
    d.items() 返回字典d中所有的键值对信息
    >>> d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
    >>> "中国" in d 
    True
    >>> d.keys()
    dict_keys(['中国', '美国', '法国'])
    >>> d.values()
    dict_values(['北京', '华盛顿', '巴黎'])
    
    函数或方法 描述
    d.get(k, ) 键k存在,则返回相应值,不在则返回
    d.pop(k, ) 键k存在,则取出相应值,不在则返回
    d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
    d.clear() 删除所有的键值对
    len(d) 返回字典d中元素的个数
    >>> d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
    >>> d.get("中国","伊斯兰堡")
    '北京'
    >>> d.get("巴基斯坦","伊斯兰堡")
    '伊斯兰堡' 
    >>> d.popitem()
    ('美国', '华盛顿')
    

    字典类型应用场景
    映射的表达

    • 映射无处不在,键值对无处不在
    • 例如:统计数据出现的次数,数据是键,次数是值
    • 最主要作用:表达键值对数据,进而操作它们

    元素遍历
    for k in d :
    <语句块>

    模块5: jieba库的使用

    jieba库概述:jieba是优秀的中文分词第三方库

    • 中文文本需要通过分词获得单个的词语
    • jieba是优秀的中文分词第三方库,需要额外安装
    • jieba库提供三种分词模式,最简单只需掌握一个函数

    jieba库的安装:(cmd命令行) pip install jieba

    jieba分词的原理:jieba分词依靠中文词库

    • 利用一个中文词库,确定中文字符之间的关联概率
    • 中文字符间概率大的组成词组,形成分词结果
    • 除了分词,用户还可以添加自定义的词组

    jieba分词的三种模式

    精确模式、全模式、搜索引擎模式

    • 精确模式:把文本精确的切分开,不存在冗余单词
    • 全模式:把文本中所有可能的词语都扫描出来,有冗余
    • 搜索引擎模式:在精确模式基础上,对长词再次切分

    jieba库常用函数

    函数 描述
    jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
    jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
    jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
    jieba.add_word(w) 向分词词典增加新词w

    jieba分词要点:jieba.lcut(s)

    实例10: 文本词频统计

    • 需求:一篇文章,出现了哪些词?哪些词出现得最多?
    • 该怎么做呢?
      英文文本 中文文本

    "Hamlet英文词频统计"实例讲解

        #CalHamletV1.py
        def getText():
            txt = open("hamlet.txt", "r").read()
            txt = txt.lower()
            for ch in '!"#$%&()*+,-./:;<=>?@[\]^_‘{|}~':
                txt = txt.replace(ch, " ")   #将文本中特殊字符替换为空格
            return txt
         
        hamletTxt = getText()
        words  = hamletTxt.split()
        counts = {}
        for word in words:           
            counts[word] = counts.get(word,0) + 1
        items = list(counts.items())
        items.sort(key=lambda x:x[1], reverse=True) 
        for i in range(10):
            word, count = items[i]
            print ("{0:<10}{1:>5}".format(word, count))
    

    "《三国演义》人物出场统计"实例讲解

        #CalThreeKingdomsV2.py
        import jieba
        excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
        txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
        words  = jieba.lcut(txt)
        counts = {}
        for word in words:
            if len(word) == 1:
                continue
            elif word == "诸葛亮" or word == "孔明曰":
                rword = "孔明"
            elif word == "关公" or word == "云长":
                rword = "关羽"
            elif word == "玄德" or word == "玄德曰":
                rword = "刘备"
            elif word == "孟德" or word == "丞相":
                rword = "曹操"
            else:
                rword = word
            counts[rword] = counts.get(rword,0) + 1
        for word in excludes:
            del counts[word]
        items = list(counts.items())
        items.sort(key=lambda x:x[1], reverse=True) 
        for i in range(10):
            word, count = items[i]
            print ("{0:<10}{1:>5}".format(word, count))
    
  • 相关阅读:
    查询SQL数据库中表占用资源情况的语句
    修改VMware网卡MAC的方法
    Ajax 与 .net Validator
    控件属性值绑定到数据
    一个设计的小例子警察抓小偷
    加密Web.config 文件中的敏感信息
    VS .Net 2005程序集换名之后的遗留问题
    为ASP.Net 创建和配置应用程序服务数据库
    ArcGIS 9.0 在Windows XP SP2 上安装的问题(数据保护造成的)
    使用客户端脚本
  • 原文地址:https://www.cnblogs.com/xusze/p/10631563.html
Copyright © 2011-2022 走看看