2023年7月26日发(作者:)
Python学习笔记(六)第六章 组合数据类型组合数据类型概述计算机不仅对单个变量表⽰的数据进⾏处理,更多情况,计算机需要对⼀组数据进⾏批量处理。⼀些例⼦包括:给定⼀组单词{python, data, function, list, loop},计算并输出每个单词的长度;给定⼀个学院学⽣信息,统计⼀下男⼥⽣⽐例;⼀次实验产⽣了很多组数据,对这些⼤量数据进⾏分析;组合数据类型能够将多个同类型或不同类型的数据组织起来,通过单⼀的表⽰使数据操作更有序更容易。根据数据之间的关系,组合数据类型可以分为三类:序列类型、集合类型和映射类型。序列类型是⼀个元素向量,元素之间存在先后关系,通过序号访问,元素之间不排他。集合类型是⼀个元素集合,元素之间⽆序,相同元素在集合中唯⼀存在。映射类型是“键-值”数据项的组合,每个元素是⼀个键值对,表⽰为(key, value)。序列类型序列类型是⼀维元素向量,元素之间存在先后关系,通过序号访问。当需要访问序列中某特定值时,只需要通过下标标出即可。序列类型⽀持成员关系操作符(in)、长度计算函数(len())、分⽚([]),元素本⾝也可以是序列类型。Python语⾔中有很多数据类型都是序列类型,其中⽐较重要的是:str(字符串)、tuple(元组)和list(列表)。元组是包含0个或多个数据项的不可变序列类型。元组⽣成后是固定的,其中任何数据项不能替换或删除。列表则是⼀个可以修改数据项的序列类型,使⽤也最灵活元组(tuple)是序列类型中⽐较特殊的类型,因为它⼀旦创建就不能被修改。元组类型在表达固定数据项、函数多返回值、多变量同步赋值、循环遍历等情况下⼗分有⽤。Python中元组采⽤逗号和圆括号(可选)来表⽰。#需要打印所有变量(⽽不只是最后⼀个)from ctiveshell import _node_interactivity = "all"creature = "cat", "dog", "tiger", "human"creaturecolor = ("red", 0x001100, "blue", creature)colorcolor[2]color[-1][2]('cat', 'dog', 'tiger', 'human')('red', 4352, 'blue', ('cat', 'dog', 'tiger', 'human'))'blue''tiger'def func(x): #函数多返回值 return x, x**3func(3)a, b = 'dog', 'tiger' #多变量同步赋值a, b = (b, a) #多变量同步赋值,括号可省略print(a,b)import mathfor x, y in ((1,0), (2,5), (3,8)): #循环遍历 print((x,y)) #求多个坐标值到原点的距离(3, 27)tiger dog1.05.38548.544集合类型集合类型与数学中集合的概念⼀致,即包含0个或多个数据项的⽆序组合。集合中元素不可重复,元素类型只能是固定数据类型,例如:整数、浮点数、字符串、元组等,列表、字典和集合类型本⾝都是可变数据类型,不能作为集合的元素出现。由于集合是⽆序组合,它没有索引和位置的概念,不能分⽚,集合中元素可以动态增加或删除。集合⽤⼤括号({})表⽰,可以⽤赋值语句⽣成⼀个集合。S = {425, "BIT", (10, "CS"), 424}ST = {425, "BIT", (10, "CS"), 424, 425, "BIT"}T{424, 425, (10, 'CS'), 'BIT'}{424, 425, (10, 'CS'), 'BIT'}由于集合元素是⽆序的,集合的打印效果与定义顺序可以不⼀致。由于集合元素独⼀⽆⼆,使⽤集合类型能够过滤掉重复元素。set(x)函数可以⽤于⽣成集合。W = set('apple')W #⾃动按字母序排列V = set(("cat", "dog", "tiger", "human"))V{'a', 'e', 'l', 'p'}{'cat', 'dog', 'human', 'tiger'}集合类型的4种基本操作,交集(&)、并集(|)、差集(-)、补集(^),操作逻辑与数学定义相同集合类型主要⽤于三个场景:成员关系测试、元素去重和删除数据项"BIT" in {"PYTHON", "BIT", 123, "GOOD"} #成员关系测试tup = ("PYTHON", "BIT", 123, "GOOD", 123) #元素去重set(tup)newtup = tuple(set(tup)-{'PYTHON'}) # 去重同时删除数据项newtupTrue{'PYTHON', 123, 'GOOD', 'BIT'}(123, 'GOOD', 'BIT')集合类型与其他类型最⼤的不同在于它不包含重复元素,因此,当需要对⼀维数据进⾏去重或进⾏数据重复处理时,⼀般通过集合来完成。映射类型映射类型是“键-值”数据项的组合,每个元素是⼀个键值对,即元素是(key, value),元素之间是⽆序的。键值对(key, value)是⼀种⼆元关系。在Python中,映射类型主要以字典(dict)体现。dic = {'name':'张三','age':20}dicdic['name']{'age': 20, 'name': '张三'}'张三'列表类型和操作列表类型的概念列表(list)是包含0个或多个对象引⽤的有序序列,属于序列类型。与元组不同,列表的长度和内容都是可变的,可⾃由对列表中数据项进⾏增加、删除或替换。列表没有长度限制,元素类型可以不同,使⽤⾮常灵活。由于列表属于序列类型,所以列表也⽀持成员关系操作符(in)、长度计算函数(len())、分⽚([])。列表可以同时使⽤正向递增序号和反向递减序号,可以采⽤标准的⽐较操作符(<、<=、==、!=、>=、>)进⾏⽐较,列表的⽐较实际上是单个数据项的逐个⽐较。列表⽤中括号([])表⽰,也可以通过list()函数将元组或字符串转化成列表。直接使⽤list()函数会返回⼀个空列表。ls = [425, "BIT", [10, "CS"], 425]lsls[2][-1][0]'C'list((425, "BIT", [10, "CS"], 425))list("中国是⼀个伟⼤的国家")list()[425, 'BIT', [10, 'CS'], 425]'C''C'[425, 'BIT', [10, 'CS'], 425]['中', '国', '是', '⼀', '个', '伟', '⼤', '的', '国', '家'][]与整数和字符串不同,列表要处理⼀组数据,因此,列表必须通过显式的数据赋值才能⽣成,简单将⼀个列表赋值给另⼀个列表不会⽣成新的列表对象。ls = [425, "BIT", 1024] #⽤数据赋值产⽣列表lslt = ls #lt是ls所对应数据的引⽤,lt并不包含真实数据ls[0] = 0
lt[0, 'BIT', 1024]列表类型的操作vlist = list(range(5))vlistlen(vlist[2:]) #计算从第3个位置开始到结尾的⼦串长度2 in vlist #判断2是否在列表vlist中vlist[3]="python" #修改序号3的元素值和类型vlist
vlist[1:3]=["bit", "computer"]
vlist [0, 1, 2, 3, 4]3True[0, 1, 2, 'python', 4][0, 'bit', 'computer', 'python', 4]与元组⼀样,列表可以通过for…in语句对其元素进⾏遍历,基本语法结构如下:for <任意变量名> in <列表名>: 语句块for e in vlist: print(e, end=" ")0 bit computer python 4
列表是⼀个⼗分灵活的数据结构,它具有处理任意长度、混合类型的能⼒,并提供了丰富的基础操作符和⽅法。当程序需要使⽤组合数据类型管理批量数据时,请尽量使⽤列表类型。基本统计值计算以最简单的统计问题为例,求解⼀组不定长数据的基本统计值,即平均值、标准差、中位数。由于平均数、标准差和中位数是三个不同的计算⽬标,使⽤函数⽅式编写计算程序。getNum()函数从⽤户输⼊获得数据mean()函数计算平均值dev()函数计算标准差median()函数计算中位数from math import sqrtdef getNum(): #获取⽤户输⼊ nums = [] iNumStr = input("请输⼊数字(直接输⼊回车退出): ") while iNumStr != "": (eval(iNumStr)) iNumStr = input("请输⼊数字(直接输⼊回车退出): ") return numsdef 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 sqrt(sdev / (len(numbers)-1))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 medn = getNum() #主体函数m = mean(n)print("平均值:{},⽅差:{:.2},中位数:{}.".format(m,dev(n,m),median(n)))请输⼊数字(直接输⼊回车退出): 98请输⼊数字(直接输⼊回车退出): 97请输⼊数字(直接输⼊回车退出): 96请输⼊数字(直接输⼊回车退出): 99请输⼊数字(直接输⼊回车退出): 95请输⼊数字(直接输⼊回车退出):
平均值:97.0,⽅差:1.6,中位数:96.程序先后调⽤getNum()、mean()、dev()和median()函数。利⽤函数的模块化设计能够复⽤代码并增加代码的可读性。每个函数内部都采⽤了简单的语句。列表在实现基本数据统计时发挥了重要作⽤,表现在:列表是⼀个动态长度的数据结构,可以根据需求增加或减少元素;列表的⼀系列⽅法或操作符为计算提供了简单的元素运算⼿段;列表提供了对每个元素的简单访问⽅式及所有元素的遍历⽅式。字典类型的计算字典类型的基本概念通过任意键信息查找⼀组数据中值信息的过程叫映射,Python语⾔中通过字典实现映射。Python语⾔中的字典可以通过⼤括号({})建⽴,建⽴模式如下:{<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>}其中,键和值通过冒号连接,不同键值对通过逗号隔开。Dcountry={"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}print(Dcountry){'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}字典打印出来的顺序与创建之初的顺序不同,这不是错误。字典是集合类型的延续,各个元素并没有顺序之分。字典最主要的⽤法是查找与特定键相对应的值,这通过索引符号来实现。Dcountry["中国"]'北京'⼀般来说,字典中键值对的访问模式如下,采⽤中括号格式:<值> = <字典变量>[<键>]字典中对某个键值的修改可以通过中括号的访问和赋值实现:Dcountry["中国"]='⼤北京'Dcountry{'中国': '⼤北京', '法国': '巴黎', '美国': '华盛顿'}字典类型的操作#通过中括号可以增加新的元素
Dcountry={"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}Dcountry["英国"]="伦敦"print(Dcountry)#直接使⽤⼤括号({})可以创建⼀个空的字典,并通过中括号([])向其增加元素Dp={}Dp['2^10']=1024Dp{'中国': '北京', '美国': '华盛顿', '法国': '巴黎', '英国': '伦敦'}{'2^10': 1024}字典类型的函数和⽅法举例:Dcountry={"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}()list(())()'中国' in Dcountry #只对键进⾏判断('美国', '悉尼') #'美国'在字典中存在('澳⼤利亚', '悉尼') #'澳⼤利亚'在字典中不存在dict_keys(['中国', '美国', '法国'])['北京', '华盛顿', '巴黎']dict_items([('中国', '北京'), ('美国', '华盛顿'), ('法国', '巴黎')])True'华盛顿''悉尼'与其他组合类型⼀样,字典可以通过for…in语句对其元素进⾏遍历,基本语法结构如下:for <变量名> in <字典名>: 语句块for key in Dcountry: print(key)中国美国法国字典是实现键值对映射的数据结构,请理解如下基本原则:字典是⼀个键值对的集合,该集合以键为索引,⼀个键信息只对应⼀个值信息;字典中元素以键信息为索引访问;字典长度是可变的,可以通过对键信息赋值实现增加或修改键值对。jieba库的使⽤jieba库的概述jieba是Python中⼀个重要的第三⽅中⽂分词函数库jieba库是第三⽅库,不是安装包⾃带,需要通过pip指令安装pip install jieba # 或者 pip3 install jiebaimport ("中国是⼀个伟⼤的国家")Building prefix dict from the default dictionary ...Dumping model to file cache F:oading model cost 2.958 dict has been built succesfully.['中国', '是', '⼀个', '伟⼤', '的', '国家']jieba库的解析import ("中华⼈民共和国是⼀个伟⼤的国家")("中华⼈民共和国是⼀个伟⼤的国家", cut_all=True)_for_search("中华⼈民共和国是⼀个伟⼤的国家")['中华⼈民共和国', '是', '⼀个', '伟⼤', '的', '国家']['中华', '中华⼈民', '中华⼈民共和国', '华⼈', '⼈民', '⼈民共和国', '共和', '共和国', '国是', '⼀个', '伟⼤', '的', '国家']['中华', '华⼈', '⼈民', '共和', '共和国', '中华⼈民共和国', '是', '⼀个', '伟⼤', '的', '国家']⽂本词频统计《Hamlet》英⽂词频统计def getText(): txt = open("f:/code/python/", "r",encoding='utf8').read() txt = () for ch in '!"#$%&()*+,-./:;<=>?@[]^_‘{|}~': txt = e(ch," ") #将⽂本中特殊字符替换为空格 return txthamletTxt = getText()words = ()counts = {}for word in words: counts[word] = (word,0) + 1items = list(())(key=lambda x:x[1], reverse=True)
for i in range(10): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))the 1137and 965to 754of 667you 550a 542i 541my 514hamlet 461in 436观察输出结果可以看到,⾼频单词⼤多数是冠词、代词、连接词等语法型词汇,并不能代表⽂章的含义。进⼀步,可以采⽤集合类型构建⼀个排除词汇库excludes,在输出结果中排除这个词汇库中内容。excludes = {"the","and","of","you","a","i","my","in","it","his","not","is","to","that","this","for","your","me","but","be","as","he","him","what"}def getText(): txt = open("f:/code/python/", "r", encoding='utf8').read() txt = () for ch in '!"#$%&()*+,-./:;<=>?@[]^_‘{|}~': txt = e(ch, " ") #将⽂本中特殊字符替换为空格 return txthamletTxt = getText()words = ()counts = {}for word in words: counts[word] = (word,0) + 1for word in excludes: del(counts[word])items = list(())(key=lambda x:x[1], reverse=True)
for i in range(10): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))hamlet 461lord 309with 268so 197king 194have 181will 169horatio 157do 151no 142《三国演义》⼈物出场统计import jiebatxt = open("f:/code/Python/三国演义.txt", "r", encoding='utf8').read()words = (txt)counts = {}for word in words: if len(word) == 1: #排除单个字符的分词结果 continue else: counts[word] = (word,0) + 1items = list(())(key=lambda x:x[1], reverse=True)
for i in range(15): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))曹操 936孔明 831将军 772却说 656⽞德 570关公 509丞相 491⼆⼈ 466不可 441荆州 421不能 387孔明⽈ 385⽞德⽈ 383如此 378张飞 348观察输出结果,同⼀个⼈物会有不同的名字,这种情况需要整合处理。同时,与英⽂词频统计类似,需要排除⼀些⼈名⽆关词汇,如“却说”、“将军”等。import jiebaexcludes = {"将军","却说","荆州","⼆⼈","不可","不能","如此"}txt = open("f:/code/Python/三国演义.txt", "r", encoding='utf8').read()words = (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] = (rword,0) + 1for word in excludes: del(counts[word])items = list(())(key=lambda x:x[1], reverse=True)
for i in range(5): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))曹操 1434孔明 1373刘备 1224关⽻ 779张飞 348请继续完善程序,排除更多⽆关词汇⼲扰,总结出场最多的20个⼈物都有哪些。这⾥,给出参考答案。曹操(1451)、孔明(1383)、刘备(1252)、关⽻(784)、张飞(358)、吕布(300)、赵云(278)、孙权(264)、司马懿(221)、周瑜(217)、袁绍(191)、马超(185)、魏延(180)、黄忠(168)、姜维(151)、马岱(127)、庞德(122)、孟获(122)、刘表(120)、夏侯惇(116)Python之禅什么样的程序是好的?如何编写漂亮的代码?这都是学习编程⼀段时间最经常提出的问题,却最难回答。程序设计语⾔如同⾃然语⾔,好的代码就像⽂学作品,不仅达意,更要优美。那什么是“好”?什么是“优美”?领悟编程代码优美的过程类似参禅,除了不断练习,也需要理解⼀些原则。Python编译器以函数库的形式内置了⼀个有趣的⽂件,被称为“Python之禅”(The Zen of Python)。当调⽤如下⼀⾏语句后,会出现⼀段有趣的运⾏结果。import thisThe Zen of Python, by Tim PetersBeautiful is better than it is better than is better than x is better than is better than is better than ility l cases aren't special enough to break the gh practicality beats should never pass explicitly the face of ambiguity, refuse the temptation to should be one-- and preferably only one --obvious way to do gh that way may not be obvious at first unless you're is better than gh never is often better than *right* the implementation is hard to explain, it's a bad the implementation is easy to explain, it may be a good aces are one honking great idea -- let's do more of those!Python之禅 作者:Tim Peters优美胜于丑陋明了胜于隐晦简洁胜于复杂复杂胜于凌乱扁平胜于嵌套间隔胜于紧凑可读性很重要即便假借特例的实⽤性之名,也不要违背上述规则除⾮你确定需要,任何错误都应该有应对当存在多种可能,不要尝试去猜测只要你不是Guido,对于问题尽量找⼀种,最好是唯⼀明显的解决⽅案做也许好过不做,但不假思索就动⼿还不如不做如果你⽆法向⼈描述你的实现⽅案,那肯定不是⼀个好⽅案如果实现⽅案容易解释,可能是个好⽅案命名空间是绝妙的理念,要多运⽤除了Python之禅所表达的Python设计理念,该程序还有另⼀段魅⼒:s = """Gur Mra bs Clguba, ol Gvz Crgref
Ornhgvshy vf orggre guna vg vf orggre guna vf orggre guna k vf orggre guna vf orggre guna vf orggre guna vyvgl y pnfrf nera'g fcrpvny rabhtu gb oernx gur tu cenpgvpnyvgl orngf fubhyq arire cnff rkcyvpvgyl gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb tu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er vf orggre guna tu arire vf bsgra orggre guna *evtug* gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq nprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""d = {}for c in (65, 97): for i in range(26): d[chr(i+c)] = chr((i+13) % 26 + c)print("".join([(c, c) for c in s]))The Zen of Python, by Tim Peters
Beautiful is better than it is better than is better than x is better than is better than is better than ility l cases aren't special enough to break the gh practicality beats should never pass explicitly the face of ambiguity, refuse the temptation to should be one-- and preferably only one --obvious way to do gh that way may not be obvious at first unless you're is better than gh never is often better than *right* the implementation is hard to explain, it's a bad the implementation is easy to explain, it may be a good aces are one honking great idea -- let's do more of those!密⽂:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z原⽂:N O P Q R S T U V W X Y Z A B C D E F G H I J K L M密⽂:a b c d e f g h i j k l m n o p q r s t u v w x y z原⽂:n o p q r s t u v w x y z a b c d e f g h i j k l m这个算法可以看作是凯撒密码的⼀种扩展,相⽐凯撒密码,采⽤循环移动13个位置,加密和解密可以⽤同⼀个程序。练习题
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690307027a329805.html
评论列表(0条)