Python的列表数据类型包含很多的方法,下面的表格中是所有的列表对象方法:

方法描述
list.append(x)把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]
list.count(x)返回 x 在列表中出现的次数
list.extend(L)将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = L
list.index(x)返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.insert(index, x)在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x)
list.pop([i])从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop() 返回最后一个元素。元素随即从列表中被删除
list.remove(x)删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误
list.reverse()反向列表中元素
list.sort([func])对原列表进行排序
list.clear()从列表中删除所有元素。相当于 del a[:]
list.copy()复制列表,等同于 a[:]

下面这个示例演示了上述列表的大部分方法:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
>>> a.pop()
1234.5
>>> a
[-1, 1, 66.25, 333, 333]

也许大家会发现像insertremove或者sort这些修改列表的方法没有打印返回值–它们返回None(别的语言可能会返回一个变化的对象,允许方法连续执行,像d->insert("a")->remove("b")->sort();),这是在python中对所有可变的数据类型这是统一的设计原则。

把列表当作堆栈使用

列表方法使得很容易将列表用作堆栈,其中添加的最后一个元素是检索的第一个元素(后进先出)。用append()方法可以把一个元素添加到堆栈顶部。用不指定索引的pop()方法可以把一个元素从堆栈顶部释放出来。示例:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

把列表当作队列使用

可以把列表当做队列使用,其中添加的第一个元素是检索的第一个元素(先进先出),但是,列表这样用效率不高。相对来说从列表末尾添加和弹出很快,从列表开始执行插入或弹出是很慢的(因为所有其他元素必须被移位一个)。要实现队列,使用collections.deque它被设计为从两端快速附加和弹出,示例:

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")   # Terry arrives
>>> queue.append("Graham")  # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue   # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

列表推导式

列表推导提供了创建列表的简洁方法,常见的应用是制作新的列表。其中每个元素应用于另一个序列的每个成员或可迭代的一些操作结果,或者通过满足特定条件的元素创建子序列。

示例,假设我们创建一个正方形列表:

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意这个for循环中的被创建(或被重写)的名为x的变量在循环完毕后依然存在。使用如下方法可以计算正方形列表:

squares = list(map(lambda x: x**2, range(10)))或者,等价于:squares = [x**2 for x in range(10)]这个方法更加简明且易读。

列表推导式由括号中包含一个表达式后跟一个for子句,然后是零个或多个for或if子句组成。其结果将是依据所述的上下文中表达产生的新列表for和if子句结构组成。

示例,如果这个列表推导式并不相等,则它将组合成两个列表的元素:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

等同于:

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
... if x != y:
...     combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

注意的是在上面两个方法中的forif语句的顺序。如果想要得到一个元组(例如,上面例子中的 (x, y)),必须要加上括号:

>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x**2 for x in range(6)]
  File "<stdin>", line 1, in ?
    [x, x**2 for x in range(6)]
       ^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表推导式可使用复杂的表达式和嵌套函数:

>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

嵌套列表推导式

列表解析中的初始表达式可以是任何表达式,包括列表解析。考虑下面由三个长度为4的列表组成的3x4矩阵:

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

将列表解析转换成行和列,可以用嵌套的列表推导式:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

嵌套的列表推导式是对for后面的内容进行求值,所以上例就等价于:

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

反过来说,如下也是一样的:

>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
... transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

在实际中,应该更喜欢使用内置函数来组成复杂流程语句。对此种情况zip()函数在下面这个用例中做得很好:

>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

del 语句删除列表

有个方法可以从列表中按给定的索引而不是值来删除一个子项: del 语句。它不同于有返回值的 pop() 方法。语句 del 还可以从列表中删除切片或清空整个列表,示例:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

del 也可以删除整个变量:

>>> del a

注意的是此后再引用命名a会引发错误(直到另一个值赋给它为止)。

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信