作者序

  学习一门编程语言,语法是最基础的。但是学习语法往往不是那么困难,因此,写一篇语法笔记似乎显得不是那么有必要。事实正如此,对于Python中的循环、判断等语句,我并没有整理的意图,因为我觉得太过多余,即使可以玩的很花。但是对于列表和字典这一章内容,其重要之处或许不在于其语法有多难,而是其体现了一些数据结构的思想。在C++中,线性表与这里的列表;查找表与这里的字典,都有着一些奇妙的联系。而因为Python很好的隐藏了一些底层实现,若不注意细节而使用这些内置函数和方法,是极有可能出错的。因此,本文将这些内容记录下来,既可以作为初学者的参考,又可以作为我的笔记以待后续查阅。

正文

列表

什么是列表

  Python中的列表是一系列特定元素按特定顺序构成的集合,这和C++中数组十分相似。对于列表,我们通常用[]来声明一个变量储存一个列表,例如

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] #初始化结束的列表
empty = [] #声明一个空列表

访问列表元素

  和C++相类似的,Python支持根据元素下标来访问元素。例如对于上面的bicycles列表,我们可以用bicycles[0]来访问元素'trek'。当然了,Python支持使用负数索引来访问列表元素,例如访问上面列表中的'specialized',我们除了使用bicycles[3],还可以使用bicycles[-1]来访问这个元素。对于长度未知的列表,我们可以用这个方式来访问末尾的几个元素。

列表元素的修改、添加和删除

  既然我们说列表是一种线性表,那么其需要能够支持线性表的基本操作。Python内置了丰富的函数和方法支持我们做到这些操作,下面逐一介绍之。

修改元素

  对于修改元素,我们可以直接指定列表元素下标修改之,例如

1
bicycles[0] = 'ducati'

这样,我们就将列表中原本的'trek'元素修改成了我们指定的'ducati'元素。

插入元素

  对于插入元素,Python提供了两种方法,分别是insert()append()。对于前者支持在指定位置插入元素,而后者是将元素插入到列表尾,例如下面代码:

1
2
3
4
5
6
bicycles = ['cannondale', 'redline', 'specialized']
print(bicycles)
bicycles.append('ducati')
print(bicycles)
bicycles.insert(2, 'trek')
print(bicycles)

则对应的程序输出为
1
2
3
['cannondale', 'redline', 'specialized']
['cannondale', 'redline', 'specialized', 'ducati']
['cannondale', 'redline', 'trek', 'specialized', 'ducati']

删除元素

  对于删除元素,一般有三种方法:del语句,pop()方法和remove()方法。

  对于del语句,你只需要指定删除的元素即可,例如

1
del bicycles[0]

就是删除bicycles中的第一个元素。

  对于pop()方法,一般由两种使用方式:无参数和指定元素下标。对于无参数的pop()方法,会删除当前列表中的最后一个元素。这种模式下的pop()方法和之前提到过的append()方法可以天然的实现一个。或者,你也可以指定pop()的参数,例如bicycles.pop(1),则其中的'redline'元素就会被移出列表。pop()方法具有返回值,返回值是被删除的元素。

  对于remove()方法,是查找列表中第一个和指定参数相同的值,将其删去。注意,由于只删除第一个查找到的值,因而如果我们要将指定参数的值都删去,需要使用循环,例如

1
2
3
4
languages = ['cpp', 'python', 'c', 'go', 'python', 'html']
while 'python' in languages:
languages.remove('python')
print(languages)

这种方式下,可以将列表中的所有指定元素都删除。

组织列表

  除了基本的增删改查,我们对于列表还需要一些操作,这种操作不更改列表元素值,但是会更改元素之间的顺序。很便于使用的,Python依然为我们内置了强大的函数和方法来实现这些功能。


函数名 解释 用法示例
sort()方法 对列表永久非减(或非增)排列 bicycles.sort()或者bicycles.sort(reverse = True)
sorted()函数 对列表临时非减(或非增)排列 sorted(bicycles)或者sorted(bicycles, reverse = True)
reverse()方法 列表逆置 bicycles.reverse()
len()函数 列表求长 len(bicycles)
example[:] 列表切片 bicycles[0:3]

  注意,复制列表时,注意一下两种方式的区别:

1
2
3
foods1 = ['apple', 'pizza', 'hamburger']
foods1 = foods2 #这种复制是错误的
foods1 = foods2[:] #利用列表切片的方式复制

第一种复制的结果是使得foods1foods2指向了同一个列表,使得在更改foods1的列表元素时,foods2也会一同改变。而后者是两个互不干涉的、独立的列表。

字典

  Python中,字典是若干组键-值对的集合,其一般形式如下:

1
2
3
4
5
target = {
'color': 'blue',
'points': 5,
'speed': 'fast',
}

通过构建这样的键值对,我们可以通过键来访问其对应的值,有点类似于自定义下标的数组。上面示例中的target,就是我们说的字典。

访问字典的值

  如同上面所说,我们完全可以把其当成数组来用。如果我们要知道targetcolor信息,我们可以通过下面的代码输出它:

1
print(target['color'])

这时控制台输出blue

添加或修改键值对

  这两点放在一起讲的原因是,两者的语法是相同的。请读者参见以下代码:

1
2
target['color'] = 'red' #1
target['x_position'] = 4 #2

对于第一条语句,首先在字典target中寻找关键字'color',由于找到的缘故,将其对应的值覆写为'red'。对于第二条语句,由于无法在字典中查询到'x_position'的任何记录,因而新建了一对键值关系,并将其插入了字典中。

删除键值对

  同样的,del语句给我们提供了删除键值对的方法。如果我们需要删除有关位置的信息,我们只需要del target['x_position']语句即可。

遍历键值对

  如果我们想遍历键值对,可以使用的最简单的语句是:

1
2
for key, value in target.items():
print(key + " " + value)

上述语句将字典中的每一个键值对,都分别把键、值赋值给了keyvalue。当然了,这时的输出顺序未必按照我们定义的一般按顺序输出,原因是字典只保证键值对的一一对应关系,而不在意互相之间的顺序问题。因此,要按照顺序遍历字典,我们需要使用其他的方式,

  对于字典,Python内置了两种方法:keys()方法和values()方法。两者返回的都是列表,前者是键组成的列表,后者是值组成的列表。相信到这里,你已经有思路如果按照顺序遍历字典了,这里给出一种方式:

1
2
3
4
5
6
7
8
favorite_language = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phli': 'python',
}
for person in sorted(favorite_language.keys()):
print(person.title() + "'s favorite language is " + favorite_language[person].title() + ".")

上面的程序输出结果是
1
2
3
4
Edward's favorite language is Ruby.
Jen's favorite language is Python.
Phli's favorite language is Python.
Sarah's favorite language is C.

由此,我们做到了按照我们所想遍历字典。

尾声

  读者可以看到,Python中的列表和字典,其实已经包含了很多数据结构的东西,并且都给我们准备了不错的函数和方法。巧妙的是,这两个结构都可以自我嵌套,甚至互相嵌套,功能可以说已经非常强大了。因此,就像学习C++时刚接触到的函数一样,列表和字典也是水很深的内容之一。随着我的了解不断深入,我也会不断更新这篇文章。基础部分,就到此为止了。