要点概括:

DataStructure-contents

1.列表

列表可以修改,而字符串和元组不能。在 Python 中,列表的方法如下所示:

DataStructure-contents

列表的部分用法如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
a = [66.25, 333, 333, 1, 1234.5]
print(a.count(333), a.count(66.25), a.count('x'))
a.insert(2, -1)
print(a)
print(a.index(333))
a.remove(333)
print(a)
a.reverse()
print(a)
a.sort()
print(a)

输出结果如下:

1
2
3
4
5
6
2 1 0
[66.25, 333, -1, 333, 1, 1234.5]
1
[66.25, -1, 333, 1, 1234.5]
[1234.5, 1, 333, -1, 66.25]
[-1, 1, 66.25, 333, 1234.5]

2.将列表用作堆栈

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用append()方法可以把一个元素添加到堆栈顶。用不指定索引的pop()方法可以把一个元素从堆栈顶释放出来。如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
stack = [3, 4, 5]
stack.append(6)
print(stack)
stack.append(7)
print(stack)
print('===============')
stack.pop()
print(stack)
stack.pop()
print(stack)

输出结果如下:

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

3.将列表用作队列

队列,第一个先被加入列表中的的元素在取出的时候会第一个出来,即先进先出。如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from collections import deque

queue = deque(['Carol', 'Jack', 'Tom'])
queue.append('Terry')
queue.append('Michael')
print(queue)
queue.popleft()  # 出队
print(queue)
queue.popleft()  # 出队
print(queue)

输出结果如下:

1
2
3
deque(['Carol', 'Jack', 'Tom', 'Terry', 'Michael'])
deque(['Jack', 'Tom', 'Terry', 'Michael'])
deque(['Tom', 'Terry', 'Michael'])

4.列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。另外,如果希望表达式推导出一个元组,就必须使用括号。下面的程序会生成110之内所有数的平方,如下所示:

1
2
a = [x * x for x in range(1, 11)]
print(a)

输出结果如下:

1
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

也可以在 for 后面加上 if 语句,下面程序可以筛选出仅由偶数组成的平方,如下所示:

1
2
a = [x * x for x in range(1, 11) if x % 2 == 0]
print(a)

输出结果如下:

1
[4, 16, 36, 64, 100]

也可以用两层循环生成全排列,如下所示:

1
2
a = [m + n for m in 'ABC' for n in 'abc']
print(a)

输出结果如下:

1
['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']

另外,对于列表推导式的执行顺序为:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,最左边的第一条语句是最后一层,如下所示:

1
[x * y for x in range(1, 5) if x > 2 for y in range(1, 4) if x < 3]

上面的式子等同于:

1
2
3
4
5
for x in range(1, 5):
    if x > 2:
        for y in range(1, 4):
            if x < 3:
                x * y

当然,这里仅仅只是解释列表推导式的执行顺序,程序本身需要修改后才能运行。

再看一个例子,如下所示:

1
2
a = [1, 2, 3]
z = [x + 1 for x in [x ** 2 for x in a]]

可以将上式改写成下面的式子,如下所示:

1
2
3
4
5
6
7
8
a = [1, 2, 3]
b = []
c = []
for x in a:
    b.append(x ** 2)
for x in b:
    c.append(x + 1)
print(c)

输出结果如下:

1
[2, 5, 10]

5.嵌套列表

下面演示的是将3x4的矩阵列表转换成4x3的矩阵列表,如下所示:

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

输出结果如下:

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

6.集合推导式

如下所示:

1
2
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a)

输出结果如下:

1
{'d', 'r'}

7.字典推导式

如下所示:

1
2
a = {x: x * 2 for x in range(5)}
print(a)

输出结果如下:

1
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}

8.遍历技巧

在字典中遍历时,关键字和对应的值可以使用items()方法同时解读出来,如下所示:

1
2
3
person = {'name': 'Carol', 'age': 20, 'gender': 'male'}
for k, v in person.items():
    print(k, v)

输出结果如下:

1
2
3
name Carol
age 20
gender male

在序列中遍历时,索引位置和对应值可以使用enumerate()函数同时得到,如下所示:

1
2
for i, v in enumerate(['Carol', 'Jack', 'Mike']):
    print(i, v)

输出结果如下:

1
2
3
0 Carol
1 Jack
2 Mike

同时遍历两个或更多的序列,可以使用zip()组合,如下所示:

1
2
3
4
5
6
questions = ['name', 'quest', 'favorite color']
answers = ['Carol', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
    print('What is your {0}? It is {1}.'.format(q, a))
    # 也可以使用%s方法输出,结果是一样的
    # print('What is your %s? It is %s.' % (q, a))

输出结果如下:

1
2
3
What is your name? It is Carol.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.

要反向遍历一个序列,首先指定这个序列,然后调用reversed()函数,如下所示:

1
2
for i in reversed(range(1, 10, 2)):
    print(i)

输出结果如下:

1
2
3
4
5
9
7
5
3
1

要按顺序遍历一个序列,使用sorted()函数返回一个已排序的序列,并不修改原值,如下所示:

1
2
3
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(set(basket)):  # set()可以去重
    print(i)

输出结果如下:

1
2
3
4
apple
banana
orange
pear