python數據組合總結

一、序列類型(字符串,元組(),列表[])

 

序列類型支持in,len(),分片[],迭代,5種內置序列類型:bytearray,bytes,list,str,tuple(元組)。

1、元組可以嵌套(如:x=str[2][1][0][1])

2、元組的命名(collections.namedtuple(),即自定義)

       樣:sale=collctions.namedtuple("sale","productid customerid date price") 逗號前的爲元組類型的名稱,逗號後的參數爲字符串,用空格分隔,每個名稱都代表該元組數據類型的一項,數據項如:x=sale(121,"2017-03-22",1,10.99);調用某一項則可用x.price來實現,此處結果爲10.99;

       對於格式化替換,可用**namedtuple._asdict()函數實現直接用名稱替換索引,如:"{productid}{price}".format(**x._asdict())。此方法用於多層元組較好,name即爲最外層元組的name.

       單個元素的元組需要加上逗號。

3、列表

       1>列表也可存儲任意類型的數據,且可使用比較操作符(逐項進行比較)和修改列表內容。

       2>列表支持元組的所有操作,同時還有以下函數:

       append()  追加

       count(x)  統計x出現的次數

       index(x,start,end)找x,如沒有則產生一個ValueError,

       extend()    (等同於+=),

       insert(i,x)  (在索引位置i處插入x),

       pop()    移除最後一項

       pop(i)    (移除i索引位置處的數據項,如沒有i值,則默認移除最後一項),

       remove(x)  (移除從左邊開始出現的第一個數據爲x的項,如沒有則返回一個ValueError),

       reverse()    反轉,

       sort()     排序。

       對序列特定位置進行賦值可以對列表中單個數據進行替換修改(x[1]=2;x[1:2]=[a,b],對片進行替換時新數據項的個數不一定要等於原數據項的個數,可以是任意個數,結果都是新的分片替換已選定的分片,如果新的替換分片爲空,就相當於刪除了已選定的原分片),del x[1:2]也可以起到刪除這一分片的效果(不過del其實是解除了這一數據項與變量之間的綁定)。

       3>用*對序列進行拆分賦值

       樣:a,*b,c=[1,2,3,4,5,6]  -> a,b,c=(1, [2, 3, 4, 5], 6)

       數據項按位置依次經變量賦值,然後將剩餘的所有數據都賦給帶有*號的變量。*的作用就是將一個iterable進行拆分.

       “*”的另一個作用是複製操作符,其效果相當於乘號,不過對象不限於數字,可以爲任何對象。

       4>列表內涵(用於創建一些含有大量數據的列表)

       [expression for item in iterable](對iterable中每個數據項進行expression操作)

       [expression for item in iterable if condition],對限定條件的對象進行操作。

       例:leaps=[y for y in range(1900,2000) if (y%4==0 and y%100!=0)or(y%400==0)] 計算閏年。(range同樣爲前閉後開)

       列表內涵的多變量嵌套:

       例:cods=[s+z+c for s in "MF" for z in "SMLX" for c in "BGW"

              if not(s=="F" and z=="X")]相當於三層疊加的for循環.

 

二、集合類型(set)({})

 

  set支持 in ,len(),比較,位邏輯操作符;並且也是iterable的。只有可hash運算的對象纔可以添加到集合中。所有內置的固定數據類型(float,frozenset,int,str,tupul...)都是可hash運算的。內置的可變數據類型(如:dict,list,set)都不是可hash運算的。

  創建一個集合可用set("a","b",3),且創建一個空集合必須用set()。集合創建時可以存在兩個相同的項,但沒意義,最終形成的集合只會保留一個。

例:s={2,"veil",("a",5),frozenset({8,4,7}),"a"}

  集合是沒索引位置區分的,也不能分片或按步距分片。集合中每個數據都是獨一無二的,所以集合常被用於刪除重複的數據項(x=list(set(x)))。

1、集合常用函數:

       s.add(x)  添加x到集合s中;

       s.clear()  清空;

       s.pop()    移除集合中任意一項,如果爲空了則返回產生KeyError異常;

       s.remove(x) 移除x項,如x不存在就產生KeyError異常;

       s.discard(x)  如果x 存在就移除掉該項;

       s.copy()   淺拷貝;  *

       s.different(t)s-t  返回一個新集合,其只包含s但不在集合t中;  *

       s.difference_update(t)s-=t  移除每一個在集合t但不在s中的項;

       s.intersection(t)s&t     返回s和t的交集;  *

2、集合聯合操作運算符結果:

       s|t,合集;s&t,交集;s-t,減去與t的交集;s^t,合集減去交集。

3、集合內涵(同列表內涵)

       {expression for item in iterable}

       {expression for item in iterable if condition}

4、固定集合(frozenset())

       一旦創建了就不可改變,同static,可用的函數只有那些不改變集合本身內容的函數(上已用*標註)。

 

三、映射類型(dict)

 

映射是鍵-值數據的無序組合。內置的映射類型有:dict(),collections.defaultdict();對於3.1以上的還有collections.OrderedDict(),它同dict()一樣,不過有索引序列。

映射的鍵只有可hash運算的類型纔可使用,而值則可使用任意類型的數據。

1、字典的創建

d=dict(id=1948,name="washer",size=3)  #關鍵字參數

d={"id":1948,"name":"washer","size":3}   #面值

d=dict({"id":1948,"name":"washer","size":3})    #面值

d=dict([("id",1948),("name","washer"),("size",3)])  #序列

d=dict(zip(("id","name","size"),(1948,"washer",3)))  #序列

{}或用d=dict()來創建一個空字典

2、使用d["id"]則返回相應的值,如果此鍵不存在,則產生一個KeyError.

d["xx"]=34可添加一個項,如果此鍵已經存在,則會修改原始的值。

del d["xx"]會刪除鍵爲"xx"的項,如果不存在則產生一個KeyError。

3、常用函數(全)

       d.clear()  清空

       d.copy()  淺拷貝

       d.pop(k,v) 返回k的值,並刪除k項,如果k不存在,就返回KeyError或者v(如v存在的話)

       d.popitem() 移除任意一對鍵-值,如果d爲空就產生KeyError

       d.values()  返回字典中所有值的視圖

       d.keys()   返回字典所有鍵的視圖

       d.items()  返回字典所有(key,value)對的視圖

       d.get(k)   返回k的值,如果k不存在就返回None

       d.get(k,v)  返回k的值,如果k不存在就返回v

       d.setdefault(k,v) 同get(),如果k不存在就插入一個k項,值爲None或者v(如果給了v)

       d.fromkeys(s,v) 返回一個dict,它的鍵爲序列s的項,值爲None或者v(如果給了v)

       d.update(a) 用a更新d,如果鍵已存在則更新值,如不存在則插入。a可以是dict也可以是(key,value)對的一個iterable.

for

4、對字典的迭代

       對鍵:for key in d:    print(key)

              或:for key in d.keys():   print(key)

       對值:for value in d.values():     print(value)

       對鍵-值:for key,value in d.items():    print(key,value)

              或:for item in d.items():    print(item[0],item[1])

5、字典鍵的視圖與項的視圖支持一些類似於集合的操作(集合處的聯合操作運算)

此可用in來查看某個鍵是否存在於dict,也可用聯合操作運算查看特定集合的鍵是否存在於dict,如下:

d={}.fromkeys("ABCD",3);  s=set("ACX"); matches=d.keys()&s  #matches=={'A','C'}

6、字典內涵

{keyexpression:valueexpression for key ,value in terable}

{keyexpression:valueexpression for key ,value in terable if condition}

例:一個字典的鍵-值反轉:inverted_d={v:k for k, v in d.items()}

7、默認字典(collectons.defaultdict())

默認字典永遠不會產生KeyError,當查詢的鍵不存在時,字典就會自動生成一個新的以此查詢鍵爲鍵的項,其值爲創建字典時設定的默認值。

例:words=collections.defaultdict(int),新增入此字典的默認值就會是數字0。傳入的int爲工廠函數(也就是一個不帶括號、沒有參數的函數),以後可用lambda函數進行簡單設置。

8、有序字典(collctions.OrderedDict())

字典的數據項以插入的順序進行保存,如果用了一個無序的字典來進行update(),得到的結果也會變成無序的。

do=collections.OderedDict([('z',5),(3,6),(8,'a')])或者先建一個空的,再一項一項的添加。

將一個普通字典轉換成有序字典:d=collections.OderedDict(sorted(d.items()))。

 

四、組合數據的迭代與複製

1、常見迭代操作符與函數:

       s+t  兩個序列的連接;

       s*n  返回n個s序列的連接的序列;

       x in s  判斷是否在內,not in;

       all(i)    如果iterable i中的每一項都評估爲True,則返回True;

       any(i)  如果任意一項爲True,則返回True;

       enumerate(i,start)通常用於for...in循環,提供一個(index,item)元組序列,其中的索引起始值爲0或start;{相當於將一個序列i折分成單個,並給每個一個序列號,用(index,item),index爲自動產生的序列號,item則依次爲i每一項的值}

       len()   返回長度;

       max(i,key) 返回iterable i 中最大的項,如果給定的是key函數,就返回key(item)值最大的項;

       min(i,key)  同上;

       range(start,stop,step) 返回一個數字迭代子,左閉右開,如果沒給start,則從0開始;

       reversed(i) 反轉序列;

       sorted(i,key,reverse)   排序;reverse=True時進行逆序排列。當key存在時可以設置爲需要的任意函數規則,甚至可以是自己構造的函數,如key=abs以絕對值排列,key=str.lower,以str中的lower()函數規則排序。sorted()排序只適用於所有數據項都可以進行互相比較的組合類型,如果有不同的類型則會產生一個TypeError。

       sum(i,start)  求和,start爲可選

       zip(i1,...,iN)  返回元組的迭代子,使用迭代子i1到iN;i1-iN都是iterable數據組,例可參考dict的zip構造方式。只要有某個iterable中的元素用完,就終止迭代過程。

2、用a=iter(iterable結構)可以獲取一個迭代子,在每次循環時可用next(a)方法獲取下一個數據項,當結尾時會產生一個StopIteration異常。

3、組合數據類型的複製。

樣:b="sudent",a=b   這樣的用等號只是簡單的將b的值賦給了a,但b的值"student"在系統內並沒有被複製成2份,只是a和b都指向"student"這個值,無論是從a還是從b改變這個對象"student",另一個變量也會顯示出改變後的結果。要想複製出一個"student"的副本則可以用加上類型名:a=str(b);或者分片的方式a=b[:],因爲提取分片時會產生一個副本。對於字典和集合類型則用copy()函數來實現。

       以上的方法都屬於淺拷貝,因爲它只會複製對象的第一層內容。如果對象中還存在可變的iterable對象,它拷貝的只是iterable對象的引用地址,如果iterable從原對象改變了,拷貝對象的iterable部分也會跟着改變。如嵌套的列表:['a',['b','c']],複製此對象['b','c']部分時只是複製的一個引用地址。 如果要對此對象進行完全的複製則需用到深拷貝,import copy;       a=copy.deepcopy(b)

4、位置常量命名一般方法:WATER,TREE,MONEY=range(1,4);那麼這三個字符的值依次就爲1,2,3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章