Python科学计算——Data Structures

The Zen of Python

为什么选择Python作为科学计算语言?

有关于MatlabPython哪个更适合作为科学计算语言的争论已久,之所以选择Python作为首选的科学计算语言,不仅仅是因为它免费,开源,有很多优秀的库和社区,基于 C 和 Fortran 开发有更好的表现,我想更多的是 Python 作为一种编程语言的简洁优雅深深吸引了我。Python 的设计原则有着禅宗的意味,输入import this就能在 Python 解释器中一窥玄机。

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 有四个内建的 Data Structures —— 列表 (List),元组 (Tuple),字典 (Dictionary) 以及集合 (Set),它们可以统称为容器 (container).

列表 (List)

Python 中最基本的数据结构是列表 (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'] # 索引除了最后一个的其他元素
  • 列表相关函数
a = [1, 2, 3, 4, 5] # a 是一个 list

与列表先关的函数有很多,例如 compare( ),len( ),sum( ),min( ),max( ) ,sorted( ) 等,它们的具体用法如下:

In: sum(a)
Out: 15
In: max(a)
Out: 5
In: len(a)
Out: 5
  • 列表相关方法
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) # 统计a中3出现的次数
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)
    最后,列表解析功能能够简化我们对列表内元素逐一进行操作的代码,如下所示:
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)

元组和列表有很多相似的地方,对列表的很多操作都可以对元组做,但元组和列表有两点不同的地方:

  • 外形上
    从外形上看,它们的区别是:列表是用方括号标记的,而元组是用圆括号标记的;
a = [1, 'abc', [2, 3], 'd'] # a 是一个 list
b = (1, 2, 3, 4, 5, 6, 7) # b 是一个 tuple
  • 功能上
    从功能上看,它们的区别是:列表可以被修改,而元组不能被修改,因此上述列表相关函数对元组适用,列表相关方法对元组往往就不适用。

  • 元组是通过函数返回多重值的便捷方法

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 中的另一种基本数据结构是字典,它将值和键练习起来,让我们可以通过键快速找到对应的值:

  • 创建一个 dictionary
empty_dict = {} # 创建一个空的dictionary
date = {'yesterday': 28, 'today': 29, 'tomorrow': 30} # 创建一个有内容的dictionary
  • 字典的访问与赋值
    我们可以通过方括号来查找键的值或为键值赋值:
date['yesterday'] # 28
date['the_day_after_tomorrow'] = 31
  • 字典的方法
date_keys = date.keys() # 返回键的列表
date_values = date.values() # 返回值得列表
date_items = date.items() # (键,值)元组的列表
  • defaultdict
    假设你需要计算某份文件中的单词数目。一个明显的方式是,建立一个键是单词,值是单词出现次数的字典。传统的方法都略显笨拙,这也是 defaultdict 的用途所在。一个 defaultdict 相当于一个标准的字典,除了当你查找一个没有包含在内的键时,它用一个你提供的零参数函数建立一个新键,并为它的值增加1。
from collections import defaultdict
 word_counts = defaultdict(int)
for word in document:
      word_counts[word] += 1
  • Counter
    一个计数器将一个序列的值转化成一个类似整型的标准字典 (即defaultdict(int))的键到值的对象映射。我们主要用它来生成直方图:
from collections import Counter
c = Counter([0, 1, 2, 0]) # c = {0 : 2, 1 : 1, 2 : 1}

注:字典的键不可改变,尤其是不能将列表作为键,如果你需要一个多维的键,应该使用元组或设法将键转换成为字符串。

集合 (Set)

集合是 Python 中内置的另外一种数据结构。同数学上的集合概念类似,它与列表的主要区别在于:1. 它的元素是不重复的,且是无序的;2. 它不支持索引,一般通过花括号或者set()函数创建。

  • 创建一个 set
s = {1, 2, 3, 4, 2} # 2会被自动去重,得到{1,2,3,4}
s = set([1, 2, 3, 4, 2]) # 同样2被自动去重,将list转换为set
  • 集合上非常快速的操作:in
test_list = [1, 3, 2, 7, 8]
4 in test_list # False, 但需要检查每个元素
test_set = set(test_list)
4 in test_set # 非常快速的检查

注:我们使用 set 的频率要远低于 dictionary 和 list。

Stay hungry, Stay foolish. -- Steve Jobs

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容