Python科學(xué)計算——Data Structures

The Zen of Python

為什么選擇Python作為科學(xué)計算語言砸逊?

有關(guān)于MatlabPython哪個更適合作為科學(xué)計算語言的爭論已久宴凉,之所以選擇Python作為首選的科學(xué)計算語言目尖,不僅僅是因為它免費(fèi)刨摩,開源跟狱,有很多優(yōu)秀的庫和社區(qū)俭厚,基于 C 和 Fortran 開發(fā)有更好的表現(xiàn),我想更多的是 Python 作為一種編程語言的簡潔優(yōu)雅深深吸引了我驶臊。Python 的設(shè)計原則有著禪宗的意味挪挤,輸入import this就能在 Python 解釋器中一窺玄機(jī)叼丑。

In [1]: import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
...

Data Structures in Python

Python 有四個內(nèi)建的 Data Structures —— 列表 (List),元組 (Tuple)扛门,字典 (Dictionary) 以及集合 (Set)鸠信,它們可以統(tǒng)稱為容器 (container).

列表 (List)

Python 中最基本的數(shù)據(jù)結(jié)構(gòu)是列表 (List)。 一個列表是一個有序的集合论寨。

a = [1, 'abc', [2, 3]] # a 是一個 list
  • 索引與切片
    通過方括號對列表的第n個元素讀值和賦值:
a[0] = 1 # 列表是從0開始索引的
a[1] = 'abc'

也可以用方括號來“切去”列表:

a[0:2] = ['abc', [2, 3]] # 索引a的前兩個元素
a[-1:] = [2, 3] # 索引a的最后一個元素
a[-2:] = ['abc', [2, 3]] # 索引a的后兩個元素
a[:-1] = [1, 'abc'] # 索引除了最后一個的其他元素
  • 列表相關(guān)函數(shù)
a = [1, 2, 3, 4, 5] # a 是一個 list

與列表先關(guān)的函數(shù)有很多星立,例如 compare( ),len( )葬凳,sum( )绰垂,min( ),max( ) 火焰,sorted( ) 等劲装,它們的具體用法如下:

In: sum(a)
Out: 15
In: max(a)
Out: 5
In: len(a)
Out: 5
  • 列表相關(guān)方法
a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5] # a 是一個 list

此外,作為對象昌简,列表本身自帶了很多實用的方法占业,如下所示:

In: a.append(1) # 在a的末尾加一個元素1
Out: a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5, 1]
In: a.count(3) # 統(tǒng)計a中3出現(xiàn)的次數(shù)
Out: 3
In: a.extend([2, 3]) # 將[2, 3]追加到a的末尾中
Out: a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
In: a.insert(2, 1) # 將1插入a索引為2的位置
Out: a = [1, 3, 1, 5, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
In: a.pop(3) # 移除a中索引為3的元素
Out: a = [1, 3, 1, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
  • 列表解析 (List comprehension)
    最后,列表解析功能能夠簡化我們對列表內(nèi)元素逐一進(jìn)行操作的代碼纯赎,如下所示:
a = [1, 2, 3]
b = []
for i in a:
    b.append(i+2)
a = [1, 2, 3]
b = [i+2 for i in a] 

元組 (Tuple)

元組和列表有很多相似的地方谦疾,對列表的很多操作都可以對元組做,但元組和列表有兩點不同的地方:

  • 外形上
    從外形上看址否,它們的區(qū)別是:列表是用方括號標(biāo)記的餐蔬,而元組是用圓括號標(biāo)記的;
a = [1, 'abc', [2, 3], 'd'] # a 是一個 list
b = (1, 2, 3, 4, 5, 6, 7) # b 是一個 tuple
  • 功能上
    從功能上看佑附,它們的區(qū)別是:列表可以被修改樊诺,而元組不能被修改,因此上述列表相關(guān)函數(shù)對元組適用音同,列表相關(guān)方法對元組往往就不適用词爬。

  • 元組是通過函數(shù)返回多重值的便捷方法

def sum_and_product(x, y):
      return (x + y), (x * y)
sp = sum_and_product(2, 3) # (5, 6)
s, p = sum_and_product(2, 3) # s = 5, p = 6

字典 (Dictionary)

Python 中的另一種基本數(shù)據(jù)結(jié)構(gòu)是字典,它將值和鍵練習(xí)起來权均,讓我們可以通過鍵快速找到對應(yīng)的值:

  • 創(chuàng)建一個 dictionary
empty_dict = {} # 創(chuàng)建一個空的dictionary
date = {'yesterday': 28, 'today': 29, 'tomorrow': 30} # 創(chuàng)建一個有內(nèi)容的dictionary
  • 字典的訪問與賦值
    我們可以通過方括號來查找鍵的值或為鍵值賦值:
date['yesterday'] # 28
date['the_day_after_tomorrow'] = 31
  • 字典的方法
date_keys = date.keys() # 返回鍵的列表
date_values = date.values() # 返回值得列表
date_items = date.items() # (鍵顿膨,值)元組的列表
  • defaultdict
    假設(shè)你需要計算某份文件中的單詞數(shù)目。一個明顯的方式是叽赊,建立一個鍵是單詞恋沃,值是單詞出現(xiàn)次數(shù)的字典。傳統(tǒng)的方法都略顯笨拙必指,這也是 defaultdict 的用途所在囊咏。一個 defaultdict 相當(dāng)于一個標(biāo)準(zhǔn)的字典,除了當(dāng)你查找一個沒有包含在內(nèi)的鍵時,它用一個你提供的零參數(shù)函數(shù)建立一個新鍵梅割,并為它的值增加1霜第。
from collections import defaultdict
 word_counts = defaultdict(int)
for word in document:
      word_counts[word] += 1
  • Counter
    一個計數(shù)器將一個序列的值轉(zhuǎn)化成一個類似整型的標(biāo)準(zhǔn)字典 (即defaultdict(int))的鍵到值的對象映射。我們主要用它來生成直方圖:
from collections import Counter
c = Counter([0, 1, 2, 0]) # c = {0 : 2, 1 : 1, 2 : 1}

注:字典的鍵不可改變户辞,尤其是不能將列表作為鍵泌类,如果你需要一個多維的鍵,應(yīng)該使用元組或設(shè)法將鍵轉(zhuǎn)換成為字符串底燎。

集合 (Set)

集合是 Python 中內(nèi)置的另外一種數(shù)據(jù)結(jié)構(gòu)刃榨。同數(shù)學(xué)上的集合概念類似,它與列表的主要區(qū)別在于:1. 它的元素是不重復(fù)的书蚪,且是無序的喇澡;2. 它不支持索引,一般通過花括號或者set()函數(shù)創(chuàng)建殊校。

  • 創(chuàng)建一個 set
s = {1, 2, 3, 4, 2} # 2會被自動去重晴玖,得到{1,2为流,3呕屎,4}
s = set([1, 2, 3, 4, 2]) # 同樣2被自動去重,將list轉(zhuǎn)換為set
  • 集合上非尘床欤快速的操作:in
test_list = [1, 3, 2, 7, 8]
4 in test_list # False, 但需要檢查每個元素
test_set = set(test_list)
4 in test_set # 非承憔Γ快速的檢查

注:我們使用 set 的頻率要遠(yuǎn)低于 dictionary 和 list。

Stay hungry, Stay foolish. -- Steve Jobs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莲祸,一起剝皮案震驚了整個濱河市蹂安,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锐帜,老刑警劉巖田盈,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缴阎,居然都是意外死亡允瞧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛮拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來述暂,“玉大人,你說我怎么就攤上這事建炫∑杈拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵肛跌,是天一觀的道長艺配。 經(jīng)常有香客問我据过,道長,這世上最難降的妖魔是什么妒挎? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮酝掩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眷柔。我一直安慰自己,他們只是感情好驯嘱,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞠评,像睡著了一般茂蚓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋涨,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音牍白,去河邊找鬼。 笑死抖棘,一個胖子當(dāng)著我的面吹牛茂腥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播切省,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼数尿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起右蹦,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晨汹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淘这,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剥扣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年钠怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晦炊。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宁脊,死狀恐怖断国,靈堂內(nèi)的尸體忽然破棺而出榆苞,到底是詐尸還是另有隱情,我是刑警寧澤坐漏,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站输涕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莱坎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一寸士、第九天 我趴在偏房一處隱蔽的房頂上張望檐什。 院中可真熱鬧,春花似錦乃正、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挠轴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岸晦,已是汗流浹背睛藻。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工邢隧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倒慧。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像迫靖,于是被迫代替她去往敵國和親兴使。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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