11 列表相关函数

前述章节讲过了列表的基本概念,列表是以方括号括起来的用逗号间隔的数据的集合类型,它是有序即可以通过位置信息索引来访问列表里的每个元素的值,同时列表也是可以被修改,增减的集合类型。 在之前的列表一章里对列表的概念、性质以及遍历都做了详细的解释,如果遗忘可以回头复习一下,本章主要就Python为列表提供的标准访问函数做一些进一步的讲解,当然读者可以通过查列表的帮助文档自行学习。

11.1 列表相关函数简介

常用的列表函数有index、count、find、append、extend等,可以查在线文档列表相关函数,这些函数基本上可以修改的集合类型均可以使用。当然也可在Python的交互环境下(>>>)用help查看列表或者其他集合类型的帮助文档。

>>> help(list)

如果想查列表的某个函数的帮助,可以如下操作:

>>> help(list.append)

当然,也有一些书籍专门讲解Python语言的各个库的基本使用,例如The Python Standard Library by Example,大家可以购买参阅。

11.2 列表的函数详解

接下来就常用的一些列表相关的函数做具体的讲解和解释,如果对列表函数内容比较熟悉,可不阅读本章,直接看下一章节。

11.2.1 查找某值位置index函数

列表的index函数和前一章字符串的index函数基本一样,也是可以查找并返回某值在集合里首次出现的位置(从左至右)。

a = [1, 3, 1, 4, 5]
p = a.index(3)
print p

程序运行结果

1

即在a列表的第1这个位置上找到了3这个值。但是我们在字符串一章里说过,index函数如果找到要查找的值,会返回其所在的位置数据,如果没找到,会异常报错,程序终止执行,在现实应用环境下一个程序不能继续执行是很危险的,应该避免,那么自然想到列表有find函数么?不好意思很不幸列表没有find函数,那咋办?这里需要注意在列表使用index之前,最好确定有查找的数据。这有些差强人意!我咋知道有还是没有?陷入僵局!Python的列表提供了一个count函数可以统计列表里某值出现的次数,没有返回0,这个可能是避免index异常报错的一个解决之道。

11.2.2 统计某值个数count函数

count函数可以统计某指定值在列表里出现的次数。

a = [1, 3, 1, 4, 5]
n = a.count(2)
print n
n = a.count(1)
print n
if a.count(6) > 0:
    print a.index(6)
else:
    print "no 6 in list"

程序执行结果如下:

0
2
no 6 in list

首先用count函数判断一下要查找的值6在列表a里出现的次数,如果列表里确有6这个值,就可以用列表的index函数对列表a进行数据6的查找位置操作。

11.2.3 插入数据insert函数

在C语言里如果想在集合里插入数据,比较麻烦,一般先把插入位置及以后的数据先后移动,然后再在该位置上插入新数据,过程需自己编写代码实现,Python下想对集合插入数据很简单用Insert函数就可以了,不需要写循环体移动数据,实际是Python在执行insert时帮大家完成了移动的操作。

a = [1, 3, 1, 4, 5]
print a
a.insert(2, 100)
print a

程序执行结果:

[1, 3, 1, 4, 5]
[1, 3, 100, 1, 4, 5]

从运行结果可以看出在a列表位置为2的地方插入了数据100,而原来从2到最后的所有数据均向后移动了一个位置。

insert函数的语法结构:

列表.insert(位置,数据)

11.2.4 尾部添加数据append函数

insert函数是在指定位置插入新数据,append函数可以在列表的尾部插入数据。

a = [1, 3, 1, 4, 5]
print a
a.append(7)
print a
a.append([1, 2])
print a

程序执行结果:

[1, 3, 1, 4, 5]
[1, 3, 1, 4, 5, 7]
[1, 3, 1, 4, 5, 7, [1, 2]]

添加的[1, 2]这个列表添加到了a列表的尾部了。这里有两个问题需要说明,1)列表里有列表,可以么?显然可以,多维列表,如何访问?用两个索引即可。

a = [[1, 2, 3], [4, 5, 6]]
print a[0][2]

结果:

3

a[0]代表[1, 2, 3],a[0][2]则指向数字3,即等价于C语言里的二维数组的概念。

0列 1列 2列
0行 1 2 3
1行 4 5 6

问题2) 这个列表[1 , 2]里的各个元素值如何单个添加到a列表丽?这里可以用列表的extend函数。

11.2.5 列表元素添加到列表extend函数

extend函数可以把列表里的元素值添加到另一个列表的尾部,似乎是两个列表的合并!

a = range(5)
b = range(5, 11)
print a
print b
a.extend(b)
print a
print b

程序执行结果如下:

[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[5, 6, 7, 8, 9, 10]

11.2.6 pop函数

pop函数可以将列表指定位置或者列表尾部的数据从列表里删除,如果列表为空时使用了pop程序会异常出错。

列表.pop([index])

pop的返回值为删除的值,括号里的[index]的意思是pop函数可以不带参数即不指定位置的情况下删除并返回列表尾部的值,如果指定了index,那就返回index位置的值,如果index位置超出了列表各元素位置也会弹出异常错误。

a = range(4)
print "0 now a is ", a
ret = a.pop()
print "1 a.pop() ->", ret
print "1 now a is ", a
ret = a.pop(1)
print "2 a.pop(1) ->", ret
print "2 now a is ", a
ret = a.pop(5)
print "3 a.pop(5) ->", ret
print "3 now a is ", a

程序运行时的结果如下:

now a is  [0, 1, 2, 3]
a.pop() 3
now a is  [0, 1, 2]
a.pop(1) 1
now a is  [0, 2]
Traceback (most recent call last):
  File "test.py", line 35, in <module>
    ret = a.pop(5)
IndexError: pop index out of range

从程序的执行结果可以看到ret = a.pop(5)这条语句出错了,原因是a列表此时只有[0, 2]这两个元素了,长度为2即index可以取值0和1,而index为5时超出了列表的index范围,即错误"index out of range"的意思就是这个意思。

11.2.7 remove函数

remove函数可以删除列表里从左至右第一次出现的某值,如果某值不存在则会报错,这个问题和index函数类似,可以用count函数统计一下是否有某值,如果该值出现次数大于0即可用remove删除最左边的(第一次出现的该值)。

a = range(10, 15)
print a
a.remove(12)
print a

程序执行结果如下所示:

[10, 11, 12, 13, 14]
[10, 11, 13, 14]

除了用count外还有一种办法是用in运算,先判断一下列表是否有某值。

a = range(10, 15)
print a
a.remove(12)
print a
if 13 in a:
    a.remove(13)
    print a
else:
    print "13 not in, not remove!"

本例子执行结果如下:

[10, 11, 12, 13, 14]
[10, 11, 13, 14]
[10, 11, 14]

从结果可以看出,在13这个数从列表a里删除,需通过13 in a这个判断为真True时才能执行。

11.3 列表综合例子

本节向将列表里有列表(非二维列表)的列表整理成一维列表,即

li = [1, 2, [3, 4], 5, [6, 7], 8, 9]

变成:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

这里介绍一个函数isinstance,这个函数有两个参数,第一个参数是变量,第二个参数是类型。

a = 12
print isinstance(a, int)
b = [1, 2]
print isinstance(b, list)

程序执行结果,通过isinstance可以判断出a和b分别是int和list类型。

True
True

那这个例子该如何实现呢?

下面是代码,大家可自己先写写,然后再看参考代码,思路是遍历li列表,如果遇到元素是列表,那么就用extend函数将列表添加到新列表b的尾部,如果不是列表那就是一个单独的数字值用append添加到列表尾部即可。

li = [1, 2, [3, 4], 5, [6, 7], 8, 9]
b = []
for i in li:
    if isinstance(i, list):
        b.extend(i)
    else:
        b.append(i)
print li
print b

本例子程序执行结果如下所示:

[1, 2, [3, 4], 5, [6, 7], 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Python编程如此简单!