利用Python進(jìn)行數(shù)據(jù)分析-數(shù)據(jù)結(jié)構(gòu)準(zhǔn)備(元組捅僵、列表家卖、字典、集合庙楚、函數(shù)篡九、推導(dǎo)式、柯里化醋奠、生成器榛臼、itertools模塊以及文件讀寫)

本文引用《利用Python進(jìn)行數(shù)據(jù)分析·第2版》

元組tuple

元組是一個(gè)固定長(zhǎng)度而且不可以改變的序列對(duì)象

定義元組的方法:

(1) 最簡(jiǎn)單的方法:

In [23]: top = 1,2,3

In [24]: top

Out[24]: (1, 2, 3)

(2) 復(fù)雜元組的定義:


In [25]: top = (1,2,3),(4,5)

In [26]: top

Out[26]: ((1, 2, 3), (4, 5))

常用方法:

tuple : 將任意序列或者迭代器轉(zhuǎn)換成元組


In [27]: tuple([1,2,3])

Out[27]: (1, 2, 3)

In [28]: tuple("wt")

Out[28]: ('w', 't')

count:統(tǒng)計(jì)頻率

In [50]: a = 1,2,2,3

In [51]: a.count(2)

Out[51]: 2

訪問(wèn) : 可以直接通過(guò)下標(biāo)來(lái)訪問(wèn)

In [29]: top[0]

Out[29]: (1, 2, 3)

修改:元組的對(duì)象一旦定義便不可以修改,除非其中存儲(chǔ)的對(duì)象是可變對(duì)象窜司,例如:

In [30]: top = 1, [1,2,3],'a'

In [31]: top[1].append('wt')

In [32]: top

Out[32]: (1, [1, 2, 3, 'wt'], 'a')

備注: [1,2,3] 為列表沛善,有序的集合,可以隨時(shí)添加和刪除其中的元素

串聯(lián): 可以使用加法運(yùn)算符把元組串聯(lián)起來(lái)

In [32]: top

Out[32]: (1, [1, 2, 3, 'wt'], 'a')

In [33]: top + (4,5,6)∪怼#第一種情況

Out[33]: (1, [1, 2, 3, 'wt'], 'a', 4, 5, 6)

In [45]: top * 2  〗鸬蟆#第二種情況

Out[45]: (1, [1, 2, 3, 'wt'], 'a', 1, [1, 2, 3, 'wt'], 'a')

拆分:拆分有兩種情況,一種是等量拆分,另一種是不等量拆分

等量拆分:

In [34]: top = 1,2,3

In [35]: a,b,c = top

In [36]: a

Out[36]: 1

不等量拆分尤蛮,p可以分配不等長(zhǎng)度的列表

In [42]: a,*p = top

In [43]: p

Out[43]: [2, 3]

變量拆分常用來(lái)迭代元組或者列表序列

In [46]: seq = (1,2,3),(4,5,6)

In [49]: for a,b,c in seq:

    ...:    print("a = {0}, b = {1}, c = {2}".format(a,b,c))

    ...:   

a = 1, b = 2, c = 3

a = 4, b = 5, c = 6

* * *

列表list

與元組相比媳友,列表的長(zhǎng)度和內(nèi)容都是可變的

定義的方法:

1.直接定義

In [52]: a_list = [1,2,3,'wt']

In [53]: a_list

Out[53]: [1, 2, 3, 'wt']

2.使用list函數(shù),list函數(shù)在數(shù)據(jù)處理中常用來(lái)實(shí)體化迭代器和生成器

In [58]: b_list = range(2,10)

In [59]: list(b_list)

Out[59]: [2, 3, 4, 5, 6, 7, 8, 9]

添加和刪除元素:

1.使用append在列表末尾添加元素

In [60]: a_list.append('wt')

In [61]: a_list

Out[61]: [1, 2, 3, 'wt', 'wt']

2.使用insert在指定位置上添加元素

In [63]: b_list = list(b_list)

In [64]: b_list.insert(1,'wt')

In [65]: b_list

Out[65]: [2, 'wt', 3, 4, 5, 6, 7, 8, 9]

3.使用pop去除指定的元素

In [66]: b_list.pop(2)

Out[66]: 3

In [67]: b_list

Out[67]: [2, 'wt', 4, 5, 6, 7, 8, 9]

4.使用remove去除某個(gè)匹配值产捞,優(yōu)先去除找到的第一個(gè)

In [69]: b_list = ['wt',1,2,'wt']

In [70]: b_list.remove('wt')

In [71]: b_list

Out[71]: [1, 2, 'wt']

常用方法:

1.使用in去檢查列表里面是否含有某個(gè)值(not ni)

In [72]: 'wt' in b_list

Out[72]: True

2.串聯(lián)和組合列表

(1) 使用 + 號(hào)將兩個(gè)列表串聯(lián)起來(lái)

In [73]: [1,2,3] + [4,5,6]

Out[73]: [1, 2, 3, 4, 5, 6]

(2) 使用extend方法追加多個(gè)元素(添加的新對(duì)象為列表類型醇锚,與append不同的是,append添加的是單個(gè)元素)

In [76]: b_list.extend(['wt','wt'])

In [77]: b_list

Out[77]: [1, 2, 'wt', 'wt', 'wt']

區(qū)別:使用 + 號(hào)串聯(lián)對(duì)象的開銷比較大坯临,因?yàn)橐陆ㄒ粋€(gè)列表焊唬,如果對(duì)象是一個(gè)大列表的時(shí)候,使用extend追加元素會(huì)比較可取

3.使用sort()函數(shù)進(jìn)行原地排序(不創(chuàng)建新的對(duì)象)

In [80]: a = [3,2,1]

In [81]: a.sort()

In [82]: a

Out[82]: [1, 2, 3]

4.切片

切片示例圖

切片的賦值:(注意要與Numpy的特點(diǎn)區(qū)分開來(lái)看靠,Numpy切片下產(chǎn)生的是視圖赶促,而不是新的對(duì)象)

In [83]: a = [1,2,3,4,5,6,7,8,9]

In [85]: a[2:3] = ['wt','wt']

In [86]: a

Out[86]: [1, 2, 'wt', 'wt', 4, 5, 6, 7, 8, 9]

In [87]: b = a[2:3]  #產(chǎn)生一個(gè)新的對(duì)象

In [88]: b = [1,1] ⌒妗#賦值

In [89]: b

Out[89]: [1, 1]

In [90]: a

Out[90]: [1, 2, 'wt', 'wt', 4, 5, 6, 7, 8, 9] ∨副酢#a的切片區(qū)域,數(shù)值沒(méi)有被改變谤祖,說(shuō)明產(chǎn)生的并非視圖

In [91]: a[::2] 【粽浴#隔兩個(gè)數(shù)取一個(gè)值,順序

Out[91]: [1, 'wt', 4, 6, 8]

In [92]: a[::-1] 〔雌辍#隔一個(gè)數(shù)取一個(gè)值空幻,倒敘

Out[92]: [9, 8, 7, 6, 5, 4, 'wt', 'wt', 2, 1]

序列函數(shù):

enumerate函數(shù),可以返回(i,value)元組序列

In [93]: for i,value in enumerate(a):∪菘汀#測(cè)試用例

    ...:    print(i,value)

    ...:   

0 1

1 2

2 wt

sorted函數(shù)從任意序列中返回一個(gè)已經(jīng)拍好序的列表(列表的元素需要為同一類型):

In [96]: sorted(["dscdcsd fsdf"])   #空格為分割符

Out[96]: ['dscdcsd fsdf']

zip函數(shù)可以將多個(gè)列別秕铛,元組或者其它序列組合成一個(gè)新的列表

In [98]: seq1 = [1,2,3]

In [99]: seq2 = ['wt','wt']

In [100]: seq3 = zip(seq1,seq2)

In [101]: seq3  #注意,如需展示列表缩挑,需要收到轉(zhuǎn)換list()

Out[101]:報(bào)錯(cuò)信息

In [102]: list(seq3)

Out[102]: [(1, 'wt'), (2, 'wt')]

In [104]: list(zip(seq1,seq2,seq4))  #zip可以合并任意長(zhǎng)度的列別但两,元素的個(gè)數(shù)取決于最短的序列

Out[104]: [(1, 'wt', 4), (2, 'wt', 5)]

In [107]: for i,j in zip(*(zip(seq1,seq2,seq4))): #zip還可以用來(lái)解壓供置,注意需要在被解壓對(duì)象之前添加一個(gè)*號(hào)

    ...:    print(i,j)

    ...:   

1 2

wt wt

4 5

#### reversed函數(shù)可以對(duì)一個(gè)列表進(jìn)行倒敘處理

In [109]: list(reversed([1,2,3]))

Out[109]: [3, 2, 1]

* * *

字典dict

字典是Python重要的數(shù)據(jù)結(jié)構(gòu)谨湘,被我們稱之為哈希映射或者關(guān)聯(lián)數(shù)組,鍵和值都是python對(duì)象, 其中芥丧,值可變但鍵不可變

創(chuàng)建方法:

常用的創(chuàng)建方法是使用{}尖括號(hào):

In [110]: dict = {"wt":10,"wt2":20}

In [111]: dict

Out[111]: {'wt': 10, 'wt2': 20}

訪問(wèn)紧阔、插入和設(shè)定:

訪問(wèn)、插入和設(shè)定的方式可以像數(shù)組一樣

In [2]: dict['wt3'] = 30   #通過(guò)訪問(wèn)鍵的方式去插入

In [3]: dict

Out[3]: {'wt': 10, 'wt2': 20, 'wt3': 30}

In [5]: dict['wt2']   #通過(guò)鍵去訪問(wèn)值value

Out[5]: 20

刪除值(同時(shí)也會(huì)刪除鍵)续担,使用del或者pop方法

In [7]: dict

Out[7]: {'wt': 10, 'wt2': 20, 'wt3': 30}

In [8]: del dict['wt3']                                    #使用del方法去刪除鍵為‘wt3’的值

In [9]: dict

Out[9]: {'wt': 10, 'wt2': 20}

In [9]: dict

Out[9]: {'wt': 10, 'wt2': 20}

In [10]: value = dict.pop('wt2')                   #使用pop方法去刪除鍵為‘wt2’的值擅耽,并把刪除的值賦值給value

In [11]: value

Out[11]: 20

In [12]: dict

Out[12]: {'wt': 10}

常用方法:

通過(guò) in 去檢查字典中是否含有指定的鍵

In [6]: 'wt2' in dict

Out[6]: True

訪問(wèn)字典中所有的keys

In [13]: dict.keys()

Out[13]: dict_keys(['wt'])

訪問(wèn)字典中所有的values

In [14]: dict.values()

Out[14]: dict_values([10])

使用update融合字典

In [16]: dict.update({"wt2":20,"wt3":30})          #使用update合并字典

In [17]: dict

Out[17]: {'wt': 10, 'wt2': 20, 'wt3': 30}

將兩個(gè)序列組合成字典

In [18]: key_list = [1,2,3]

In [19]: value_list = [4,5,6]

In [20]: mapping = {}
#組合的第一種方法
In [21]: for key,value in zip(key_list,value_list):    

    ...:    mapping[key] = value

    ...:   

In [22]: mapping
Out[22]: {1: 4, 2: 5, 3: 6}
#組合的第二種方法
In [23]: list = list(zip(key_list,value_list))
In [24]: list
Out[24]: [(1, 4), (2, 5), (3, 6)]  #此為二元列表,可以使用dict方法來(lái)轉(zhuǎn)換成字典
In [31]: mapping2 = dict(list)
In [32]: mapping2
Out[32]: {1: 4, 2: 5, 3: 6}

默認(rèn)值

dict的方法get和pop可以取默認(rèn)值物遇,并返回

#此種代碼邏輯十分常見(jiàn)
In [33]: if key in some_dict:
    ...:     value = some_dict[key]
    ...: else:
    ...:     value = default_value
    ...:    

常用的方法還有collections, defaultdict, setdefault


集合set

集合是無(wú)序而又沒(méi)有重復(fù)元素的集合乖仇,可以看作只有鍵而沒(méi)有值的字典

定義方法:

直接使用{}尖括號(hào)

In [34]: mySet = {1,2,3}

In [35]: mySet
Out[35]: {1, 2, 3}

使用方法set

In [36]: mySet = set([4,5,6])

In [37]: mySet
Out[37]: {4, 5, 6}

常用方法:

合并憾儒,取兩個(gè)集合不重復(fù)的元素,然后組合成一個(gè)新的集合乃沙,可以用union方法或者 | 運(yùn)算符

In [38]: set1 = {1,2,3}

In [39]: set2 = {2,3,4}

In [40]: set1.union(set2)       #第一種方法起趾,使用union
Out[40]: {1, 2, 3, 4}

In [41]: set1 | set2                #第二種方法,使用 | 運(yùn)算符
Out[41]: {1, 2, 3, 4}

交集警儒,取兩個(gè)集合中重復(fù)的集合训裆,然后組合成一個(gè)新的集合,可以用intersection 或者 & 運(yùn)算符

In [42]: set1.intersection(set2)   #第一種方法冷蚂,使用intersection
Out[42]: {2, 3}

In [43]: set1 & set2   # 第二種方法缭保,使用 & 運(yùn)算符
Out[43]: {2, 3}
集合常用的方法

所有邏輯集合操作都有另外的原地實(shí)現(xiàn)方法汛闸,可以直接用結(jié)果替代集合的內(nèi)容蝙茶。對(duì)于大的集合,這么做效率更高诸老。


列表隆夯,集合,字典推導(dǎo)式

列表推導(dǎo)式:

[expr for val in collection if condition]

集合推導(dǎo)式

set_comp = {expr for value in collection if condition}

字典推導(dǎo)式

dict_comp = {key-expr : value-expr for value in collection if condition}

函數(shù)

函數(shù)的應(yīng)用十分廣泛别伏,其中蹄衷,值得注意的是,函數(shù)的返回值的形式可以多種多樣厘肮,例如愧口,返回字典

def f():
  a = 5
  b = 6
  c = 7
  return {'a':a,'b':b,'c':c}

有時(shí)候,我們需要對(duì)同一個(gè)字符串做一系列的函數(shù)操作类茂,此時(shí)耍属,最簡(jiǎn)單的方法是,我們把所有的方法封裝成一個(gè)列表巩检,然后再遍歷執(zhí)行(多函數(shù)模式)

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

clean_ops = [str.strip, remove_punctuation, str.title]  #一系列的函數(shù)名

def clean_strings(strings, ops):
    result = []
    for value in strings:
        for function in ops:   #遍歷調(diào)用列表中的函數(shù)
            value = function(value)
        result.append(value)
    return result

等同于

def clean_strings(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!#?]', '', value)
        value = value.title()
        result.append(value)
    return result

我們還可以將函數(shù)作為另一個(gè)函數(shù)的參數(shù)厚骗,例如內(nèi)置的map函數(shù),它的作用是在一組數(shù)據(jù)上應(yīng)用一個(gè)函數(shù):

In [10]: def change(value):
    return str(str(value) + "wt")
   ....: 

In [7]: list = [1,2,3]

In [11]: for i in map(change,list):    #將list的元素經(jīng)過(guò)change()處理之后兢哭,再賦值給 i
    print(i)
   ....:     
1wt
2wt
3wt

同時(shí)领舰,我們還可以使用lambda匿名函數(shù),這種用法要比完整的函數(shù)聲明和定義要簡(jiǎn)潔得多

In [3]: def double(list,f):
    return [f(x) for x in list]
   ...: 

In [4]: print(double(my_list,lambda x:x*2))
[2, 4, 6]

柯里化迟螺,部分參數(shù)的應(yīng)用

柯里化是一個(gè)計(jì)算機(jī)科學(xué)術(shù)語(yǔ)冲秽,它的意思就是部分參數(shù)應(yīng)用,由現(xiàn)有的函數(shù)組合成一個(gè)新的函數(shù)

In [5]: def add(x,y):
   ...:     return x+y
   ...: 

In [6]: add_one = lambda x: add(x,1)    #派生出一個(gè)新函數(shù)

In [7]: print(add_one(2))
3

等同于

In [9]: from functools import partial
In [12]: add_one = partial(add,y=1)

In [13]: print(add_one(2))
3

生成器表達(dá)式

In [189]: gen = (x ** 2 for x in range(100))

itertools模塊

常用的函數(shù)

讀寫文件

讀寫文件一般使用with語(yǔ)句矩父,不僅方便讀取數(shù)據(jù)劳跃,而且在退出代碼塊之后會(huì)自動(dòng)清理文件

In [212]: with open(path , "r") as f:     #讀文件
   .....:     lines = [x.rstrip() for x in f]

In [225]: with open('path'.txt', 'w') as handle:    #寫文件
   .....:     handle.writelines(x for x in open(path) if len(x) > 1)
Python的文件模式

Python重要的文件方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浙垫,隨后出現(xiàn)的幾起案子刨仑,更是在濱河造成了極大的恐慌郑诺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉武,死亡現(xiàn)場(chǎng)離奇詭異辙诞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轻抱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門飞涂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祈搜,你說(shuō)我怎么就攤上這事较店。” “怎么了容燕?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵梁呈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蘸秘,道長(zhǎng)官卡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任醋虏,我火速辦了婚禮寻咒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颈嚼。我一直安慰自己毛秘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布阻课。 她就那樣靜靜地躺著叫挟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柑肴。 梳的紋絲不亂的頭發(fā)上霞揉,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音晰骑,去河邊找鬼适秩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硕舆,可吹牛的內(nèi)容都是我干的秽荞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼抚官,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扬跋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起凌节,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钦听,失蹤者是張志新(化名)和其女友劉穎洒试,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴上,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垒棋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痪宰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叼架。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衣撬,靈堂內(nèi)的尸體忽然破棺而出乖订,到底是詐尸還是另有隱情,我是刑警寧澤具练,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布乍构,位于F島的核電站,受9級(jí)特大地震影響靠粪,放射性物質(zhì)發(fā)生泄漏蜡吧。R本人自食惡果不足惜毫蚓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一占键、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧元潘,春花似錦畔乙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至钥庇,卻和暖如春牍鞠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背评姨。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工难述, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吐句。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓胁后,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗦枢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攀芯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 我記不得是從什么時(shí)候開始,爸爸和爺爺就讓我背著小書包來(lái)到一個(gè)我從來(lái)沒(méi)有來(lái)到的地方文虏,那天 侣诺,我記得太陽(yáng)公公特別...
    小確幸_23b9閱讀 587評(píng)論 1 2
  • 一個(gè)尋常的一天年鸳,見(jiàn)了久未見(jiàn)面的朋友剃氧,于是和她在一起聊天,她給我講她的同學(xué)的事阻星,那段時(shí)間我的心情是十分的迷茫沒(méi)有...
    悠然晨欣閱讀 438評(píng)論 2 3
  • 雪 紛紛揚(yáng)揚(yáng) 落在梧桐樹上 還有幾個(gè)果子 安安靜靜的 掛在枝上 雪 砸在臉上 眼睛都睜不開 頭發(fā)上 衣服上 落滿了...
    jscfc閱讀 131評(píng)論 0 2