intumu.com:机器学习(ML)、人工智能(AI)和土木工程的(TM)关系?zhuanlan.zhihu.com

前言

着手开始写的时候就一直有一个画面在脑子中出现:小猪佩奇第N级,猪爸爸拿出来一本《混凝土的故事》,打开书的时候说道:混凝土是由砂子、水、水泥组成的,结果其他人都睡着了。于是,我在想,要是给土木人讲:python万法皆对象,对象类型有:数字:int,long,float,complex,bool

字符:str,unicod

列表:list

字典:dict

元组:tuple

文件:file

其他类型:集合(set),冻结集合(frozenset),类类型等。

是不是也有人睡着?相反,如果我直接说砂子、水泥、钢筋、混凝土,是不是觉得亲切?所以接下来将会从一砖一瓦的建筑材料说Python。

万法皆对象:在基建领域,你所看到的构筑物就是有以上提到的基础建材组成;在Python领域对象类型就可以看做基础建筑材料,然后由不同的施工工艺产生不同的单体模块或构造物。例如:一个函数(施工工艺)所包含的参数(基础建材),形成一个伪代码。

伪代码

#围墙条形基础开挖

变量类型:铲子、䦆头、羊角碾、块石、砖头、水泥、混凝土

#工艺流程:

开挖条形基坑

夯实基础

抛填块片石

混凝土填充找平

砌砖

#以上即为面向过程编程,下面先说说数字类型。

真代码

字典

字典 dictionary ,在一些编程语言中也称为 hash , map ,是一种由键值对组成的数据结构。

顾名思义,我们把键想象成字典中的单词,值想象成词对应的定义,那么——

一个词可以对应一个或者多个定义,但是这些定义只能通过这个词来进行查询。

基本操作

空字典

Python 使用 {} 或者 dict() 来创建一个空的字典:

a = {}

type(a)

dict

a = dict()

type(a)

dict

有了dict之后,可以用索引键值的方法向其中添加元素,也可以通过索引来查看元素的值:

插入键值

a["one"] = "this is number 1"

a["two"] = "this is number 2"

a

{'one': 'this is number 1', 'two': 'this is number 2'}

查看键值

a['one']

'this is number 1'

更新键值

a["one"] = "this is number 1, too"

a

{'one': 'this is number 1, too', 'two': 'this is number 2'}

初始化字典

可以看到,Python使用key: value这样的结构来表示字典中的元素结构,事实上,可以直接使用这样的结构来初始化一个字典:

b = {'one': 'this is number 1', 'two': 'this is number 2'}

b['one']

'this is number 1'

字典没有顺序

当我们 print 一个字典时,Python并不一定按照插入键值的先后顺序进行显示,因为字典中的键本身不一定是有序的。

print(a)

{'one': 'this is number 1, too', 'two': 'this is number 2'}

print(b)

{'one': 'this is number 1', 'two': 'this is number 2'}

因此,Python中不能用支持用数字索引按顺序查看字典中的值,而且数字本身也有可能成为键值,这样会引起混淆:

# 会报错

a[0]

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in ()

1 # 会报错

----> 2 a[0]

KeyError: 0

键必须是不可变的类型

出于hash的目的,Python中要求这些键值对的键必须是不可变的,而值可以是任意的Python对象。

一个表示近义词的字典:

synonyms = {}

synonyms['mutable'] = ['changeable', 'variable', 'varying', 'fluctuating',

'shifting', 'inconsistent', 'unpredictable', 'inconstant',

'fickle', 'uneven', 'unstable', 'protean']

synonyms['immutable'] = ['fixed', 'set', 'rigid', 'inflexible',

'permanent', 'established', 'carved in stone']

synonyms

{'immutable': ['fixed',

'set',

'rigid',

'inflexible',

'permanent',

'established',

'carved in stone'],

'mutable': ['changeable',

'variable',

'varying',

'fluctuating',

'shifting',

'inconsistent',

'unpredictable',

'inconstant',

'fickle',

'uneven',

'unstable',

'protean']}

另一个例子:

# 定义四个字典

e1 = {'mag': 0.05, 'width': 20}

e2 = {'mag': 0.04, 'width': 25}

e3 = {'mag': 0.05, 'width': 80}

e4 = {'mag': 0.03, 'width': 30}

# 以字典作为值传入新的字典

events = {500: e1, 760: e2, 3001: e3, 4180: e4}

events

{500: {'mag': 0.05, 'width': 20},

760: {'mag': 0.04, 'width': 25},

3001: {'mag': 0.05, 'width': 80},

4180: {'mag': 0.03, 'width': 30}}

键(或者值)的数据类型可以不同:

people = [

{'first': 'Sam', 'last': 'Malone', 'name': 35},

{'first': 'Woody', 'last': 'Boyd', 'name': 21},

{'first': 'Norm', 'last': 'Peterson', 'name': 34},

{'first': 'Diane', 'last': 'Chambers', 'name': 33}

]

people

[{'first': 'Sam', 'last': 'Malone', 'name': 35},

{'first': 'Woody', 'last': 'Boyd', 'name': 21},

{'first': 'Norm', 'last': 'Peterson', 'name': 34},

{'first': 'Diane', 'last': 'Chambers', 'name': 33}]

使用 dict 初始化字典

除了通常的定义方式,还可以通过 dict() 转化来生成字典:

inventory = dict(

[('foozelator', 123),

('frombicator', 18),

('spatzleblock', 34),

('snitzelhogen', 23)

])

inventory

{'foozelator': 123, 'frombicator': 18, 'snitzelhogen': 23, 'spatzleblock': 34}

利用索引直接更新键值对:

inventory['frombicator'] += 1

inventory

{'foozelator': 123, 'frombicator': 19, 'snitzelhogen': 23, 'spatzleblock': 34}

适合做键的类型

在不可变类型中,整数和字符串是字典中最常用的类型;而浮点数通常不推荐用来做键,原因如下:

data = {}

data[1.1 + 2.2] = 6.6

# 会报错

data[3.3]

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in ()

2 data[1.1 + 2.2] = 6.6

3 # 会报错

----> 4 data[3.3]

KeyError: 3.3

事实上,观察data的值就会发现,这个错误是由浮点数的精度问题所引起的:

data

{3.3000000000000003: 6.6}

有时候,也可以使用元组作为键值,例如,可以用元组做键来表示从第一个城市飞往第二个城市航班数的多少:

connections = {}

connections[('New York', 'Seattle')] = 100

connections[('Austin', 'New York')] = 200

connections[('New York', 'Austin')] = 400

元组是有序的,因此 ('New York', 'Austin') 和 ('Austin', 'New York') 是两个不同的键:

print(connections[('Austin', 'New York')])

print(connections[('New York', 'Austin')])

200

400

字典方法

get 方法

之前已经见过,用索引可以找到一个键对应的值,但是当字典中没有这个键的时候,Python会报错,这时候可以使用字典的 get 方法来处理这种情况,其用法如下:

`d.get(key, default = None)`

返回字典中键 key 对应的值,如果没有这个键,返回 default 指定的值(默认是 None )。

a = {}

a["one"] = "this is number 1"

a["two"] = "this is number 2"

索引不存在的键值会报错:

a["three"]

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in ()

----> 1 a["three"]

KeyError: 'three'

改用get方法:

print(a.get("three"))

None

指定默认值参数:

a.get("three", "undefined")

'undefined'

pop 方法删除元素

pop 方法可以用来弹出字典中某个键对应的值,同时也可以指定默认参数:

`d.pop(key, default = None)`

删除并返回字典中键 key 对应的值,如果没有这个键,返回 default 指定的值(默认是 None )。

a

{'one': 'this is number 1', 'two': 'this is number 2'}

弹出并返回值:

a.pop("two")

'this is number 2'

a

{'one': 'this is number 1'}

弹出不存在的键值:

a.pop("two", 'not exist')

'not exist'

与列表一样,del 函数可以用来删除字典中特定的键值对,例如:

del a["one"]

a

{}

update方法更新字典

之前已经知道,可以通过索引来插入、修改单个键值对,但是如果想对多个键值对进行操作,这种方法就显得比较麻烦,好在有 update 方法:

`d.update(newd)`

将字典newd中的内容更新到d中去。

person = {}

person['first'] = "Jmes"

person['last'] = "Maxwell"

person['born'] = 1831

print(person)

{'first': 'Jmes', 'last': 'Maxwell', 'born': 1831}

把'first'改成'James',同时插入'middle'的值'Clerk':

person_modifications = {'first': 'James', 'middle': 'Clerk'}

person.update(person_modifications)

print(person)

{'first': 'James', 'last': 'Maxwell', 'born': 1831, 'middle': 'Clerk'}

in查询字典中是否有该键

barn = {'cows': 1, 'dogs': 5, 'cats': 3}

in 可以用来判断字典中是否有某个特定的键:

'chickens' in barn

False

'cows' in barn

True

keys 方法,values 方法和items 方法

`d.keys()`

返回一个由所有键组成的列表;

`d.values()`

返回一个由所有值组成的列表;

`d.items()`

返回一个由所有键值对元组组成的列表;

barn.keys()

dict_keys(['cows', 'dogs', 'cats'])

barn.values()

dict_values([1, 5, 3])

barn.items()

dict_items([('cows', 1), ('dogs', 5), ('cats', 3)])

注意一件事:keys() 返回的值跟 values() 返回的值是一一对应的。

土木狗的视角:字典是Python里面最常用的类型之一,其含义是一组键值对。在前面我们讲列表的时候提到过list = [砂子,水泥,石子,砖头]这样一个类似工地堆场的列表;事实上字典,就是再给这些元素起一个名字,用来调用,例如:dict = {0:砂子,1:水泥,2:石子,3:砖头},这就是一个字典的键值对。在调用的时候,前面的列表list[0]代表的就是砂子,而字典dict[0]代表的也是砂子,两者不同点在于:列表中的元素一旦定义,他的位子是固定的,而字典里面的元素(键值对)顺序是无序的。

关于字典的具体操作,如pop、del、get以及keys、values、items等,再实际使用过程中再去体会他们的差别。

课后作业(可选)

按上一节运行自己的项目,新建一个*.ipynb文件,将上面代码敲入运行。

intumu.com:Python数据分析及可视化实例目录zhuanlan.zhihu.com