当前位置: 首页 > 后端技术 > Python

DataAnalysiswithPython——1数据结构、函数和文件

时间:2023-03-25 19:27:18 Python

这篇文章是我个人对这本书的学习《利用 Python 进行数据分析》。整个系列今天开始连载。1.1数据结构Python的基本数据结构包括元组、列表、字典、集合,以及一些特殊的数据结构(如范围对象、字符串等)。1.1.1什么是元组?元组是固定长度、不可变内容的序列。如何创建元组?#用逗号分隔是创建元组的最简单方法tup=1,2,3tup="a","b","any"tup=(2,3,4),(5,6)#usetuple()可以把一个序列转成元组tup=tuple([2,3,4])元组的内容是不可变的,这句话怎么理解?in:tupout:(2,3,4)in:tup[0]=5#这行命令不能运行,因为元组中的值不能改变#但是,如果元组中的一个对象是可以改变的并且可以在其对应的位置进行修改:tup=(1,[1,2,3],2)tup[1].append(4)tupout:(1,[1,2,3,4],2)虽然元组的内容是不可变的,但是元组是可以连接和拆分的。#连接元组(1,2,4)+('haha',[2,3],True)#使用加号连接元组(1,2)*3#使用乘号复制元组Concatenation#拆分元组a,b,c=(1,2,3)a,b,(c,d)=(1,2,(3,4))#即使元组内的元组也会拆分:info='name','age','job','zipcode'a,b,*_=info#可以从元组的开头选择想要的值,剩下的保存在*_中print('a={},b={}'.format(a,b))out:a=name,b=age元组,常用count()。in:num=1,2,2,2,3,4,5num.count(2)#count()可以用来计数:计算一个值在元组对象中出现的总次数out:31.1.2列表(list)与元组不同的是,列表的长度是可变的,内容也是可以修改的。如何创建列表?list_fruit=['apple','banana','orange','orange']tup='apple','banana','orange','orange'list_fruit=list(tup)#你可以使用list()来结合其他序列被转换为列表列表的可变性允许我们对列表执行许多操作。向列表添加或删除元素:#添加元素list_fruit.append('pear')#在列表末尾添加元素list_fruit.insert(1,'durian')#在列表的特定位置添加元素#insertthanappend计算量较大,因为插入后,后续元素的引用必须在内部迁移#移除元素list_fruit.pop(1)#移除并返回指定位置的元素list_fruit.remove('orange')#移除元素指定元素(从第一个开始,一次删除一个)#列表的串联list_fruit+['melon','grape']list_fruit.extend(['durian','watermelon'])#你可以使用extend()追加多个元素#加法计算量更大,因为加法会创建一个新的列表,而extend()将元素排序追加到原来的列表中#sort()可以对一个列表进行原地排序(无需创建新对象):a=[2,4,6,3,1]a.sort()aout:[1,2,3,4,6]#默认是升序in:b=['hah','kdjalkdjalk','d','ldkld']b.sort(key=len)#通过指定key参数,可以根据元素的长度来排列bout:['d','hah','ldkld','kdjalkdjalk']#sorted()也可以排序,但是不会改变原来的顺序,而是新建一个列表:a=[1,5,7,3,4]print('sorted_a=',sorted(a))print('a=',a)out:sorted_a=[1,3,4,5,7]a=[1,5,7,3,4]切入:seq=[1,2,4,6,2,4,8,9]seq[1:4]out:[2,4,6]in:seq[0:2]=[100,60]#你可以直接给切片赋值,这样会改变原来的listseqout:[100,60,4,6,2,4,8,9]in:seq[::2]#在第二个冒号之后使用step取一段距离的元素seq[::-1]#这个方法可以把list倒过来:[100,4,2,8][9,8,4,2,6,4,60,100]#PS:元组也可以切片:)enumerate()sequencefunction#在迭代的时候,我们往往想知道当前项的序号,所以我们可能会可以这样写:i=0forvalueinlist_fruit:print('第{}个元素是:{}'.format(i,value))i+=1#上面的代码可以简化为:fori,valueinenumerate(list_fruit):#可以返回(i,value)样式的元组print('第{}个元素是:{}'.format(i,value))zip()成对组合#zip()可以组合多个Sequence组合成一个zip对象(元组列表):seq1=[1,2,3]seq2=['happy','sad','angry','peace']zipped=zip(seq1,seq2)zippedout:#这是一个迭代器,你可以调用__next__()in:list(zipped)#使用list()实现迭代器out:[(1,'happy'),(2,'sad'),(3,'生气')]#可以看到,zip后的元组个数取决于最短序列reversed()reversesequencein:seq1=[1,2,3]r=reversed(seq1)#reversed函数生成一个list_reverseiterator对象--从后往前迭代的iteratorlist(r)#看内容还是要用list()实体化迭代器对象out:[3,2,1]1.1.3字典(dict)的使用)我把字典的用法记录的比较零散,下面直接列出:#可以用in查看字典是否包含某个keyin:dict_test1={'a':'hahaha','b':[1,3,4],3:(12,3)}'a'indict_test1out:True#将键值移出字典deldict_test1['b']#del可以删除一对键值dict_test1.pop(3)#pop()可以删除一对键值并返回删除的值#得到键列表和值列表list(dict_test1.keys())#学习使用list()函数,可以具体化一些特殊的序列cannotusesubscriptstoaccesskeys=dict_test1.keys()keys[0]#这个命令不能运行list(keys)[0]#只有这样才可以#更新字典#update函数可以更新字典(keys存在的,替换值;不存在的键,新的追加键值)in:d={'a':123,'b':456}d.update({'b':789,'c':'update'})out:{'a':123,'b':789,'c':'Update'}1.1.4Set(集合)Set是一个无序的、不可重复的元素集合.它的概念类似于数学中的集合,可以进行归并、交集等数学运算。#Createacollectionin:{2,2,2,1,3,3}set([2,2,2,1,3,3])#set()可以将其他序列转换成一个collectionout:{1,2,3}#集合是不可重复的a={1,2,3,4,5}b={3,4,5,6,7,8}#uniona.union(b)a|b#Intersectiona.intersection(b)a&b1.1.5rangeobjectrange()是for循环中经常使用的一个函数。我在测试代码的时候无意中发现range()创建的对象既不是元组也不是列表,而是一个唯一的范围对象。范围对象就像一个元组,它的内容是不可修改的;但是range对象不能像元组一样存储不同类型的内容,只能存储等差数列。范围对象、字符串、元组、列表、字典、集合,都是可迭代对象。我们可以使用iter()构建一个迭代器。#以range对象为例in:a=range(2)iter_test=iter(a)#基于可迭代对象,创建迭代器iter_testout:in:iter_test.__next__()#Iterator两者都有一个__next__()方法,它可以返回下一个元素out:0in:iter_test.__next__()out:1in:iter_test.__next__()out:Traceback(mostrecentcalllast):File"",line1,inStopIteration#迭代器是一次性使用的,从头迭代到尾,然后就不能再迭代了。for循环的本质是根据可迭代对象构建一个迭代器,依次迭代到最后。1.1.6列表理解for循环代码可以通过列表理解来简化:in:string=['a','apple','orange','banana'][i.upper()foriinstringiflen(i)>2]out:['APPLE','ORANGE','BANANA']推导也可以嵌套:in:all_data=[['Eureka','Nirvash','Landon'],['Bill','Steve']][namefornamesinall_datafornameinnamesiflen(name)>5]out:['Eureka','Nirvash','Landon']1.2函数Python中有几个特殊的函数如何使用:#函数可以返回多个值deff():a=5b=6c=7returna,b,ca,b,c=f()#Lambda函数(匿名函数)defshort_function(x):returnx*2equiv_anon=lambdax:x*2#这个匿名函数和上面的常规函数??效果一样#该函数作为参数传递给另一个函数defapply_to_list(some_list,f):#这里的f是一个函数return[f(x)forxinsome_list]ints=[4,0,1,5,6]apply_to_list(ints,lambdax:x*2)#这里我们传递一个匿名函数作为1.3文件操作中的一个参数Python可以创建和打开本地文件。我更喜欢以下方法:withopen('tmp.txt','a')asf:#a:appendmodef.write('addsomewords.')