《Python基础教程》读书笔记02-列表和元组

最基本的数据结构:序列(sequence),序列中每个元素被分配一个序列号(即元素的位置),也称为索引

Python 包含六种内建的序列,列表、元组、字符串、Unicode 字符串、buffer 对象和 xrange 对象。

列表和元组的主要区别在于,列表可以修改,元组不能。内建函数一般会返回元组。

在 dict 中可以使用元组作为键,而不能使用列表,因为键是不能修改的(不可变对象)。

通用序列操作

索引

>>> x = 'hello'
>>> x[0]
'h'
>>> x[-1] # 可以使用负数索引
'o'
>>> 'hello'[0]
'h'

分片(切片)

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[0:1] # 不包含第二个索引
[1]
>>> numbers[-3:] # 可以使用负数索引
[8, 9, 10]
>>> numbers[-3:-1] # 开始点必须小于结束点
[8, 9]
>>> numbers[7:] # 如果分片所得的部分要包含序列结尾的元素
[8, 9, 10]
>>> numbers[:3] # 也可以空置第一个索引
[1, 2, 3]
>>> numbers[:] # 复制整个序列
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

步长,在上面的例子中步长默认为 1

>>> numbers[0:10:1] # 默认不写,步长为1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
>>> numbers[::4]
[1, 5, 9]

# 当使用负数作为步长时,必须开始点大于结束点
>>> numbers[8:3:-1] # 步长可以为负数,此时分片从右到左提取元素,同样开始点包含,结束点不包含
[9, 8, 7, 6, 5]
>>> numbers[5::-2]
[6, 4, 2]
>>> numbers[:5:-2]
[10, 8]
>>> numbers[-1:-5:-2]
[10, 8]

序列相加

相同类型的序列才可以相加,列表与字符串无法连接在一起

>>> [1,2,3] + [4,5]
[1, 2, 3, 4, 5]
>>> [1,2] + 'hello'

Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    [1,2] + 'hello'
TypeError: can only concatenate list (not "str") to list
>>> 'hello, ' + 'world'
'hello, world'
>>> [1, 1] + ['a', 'b']
[1, 1, 'a', 'b']

乘法

>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
>>> sequence = [None] * 10 # 可以用于创建一个占用10个元素空间,却不包含任何有用内容的列表
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

成员资格(是否包含)

包含返回 True,不包含返回 False

>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
>>> users = ['zhang', 'wang', 'li']
>>> 'li' in users
True
>>> 'zhao' in users
False
>>> 'rw' in permissions
True
>>> users = [['zhang', 1], ['wang', 2], ['li', 3]]
>>> ['li', 3] in users
True

长度、最小值和最大值

>>> numbers = [100, 34, 678]
>>> len(numbers) # len函数返回序列中所包含元素的数量
3
>>> max(numbers) # 返回最大元素
678
>>> min(numbers) # 返回最小元素
34
>>> max(2, 3)  # 这里的参数不是序列,而是以多个数字直接作为参数,可变参数
3
>>> min(5, 3, 6)
3

列表

list

>>> x = list('hello') # list 是一种类型,不是函数
>>> x
['h', 'e', 'l', 'l', 'o']
>>> ''.join(x) # 将一个由字符串组成的列表转换为字符串
'hello'

元素赋值

>>> x
['h', 'e', 'l', 'o']
>>> x[1] = '2' # 不能越界
>>> x
['h', '2', 'l', 'o']

分片赋值

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar') # 可以一次为多个元素赋值
>>> name
['P', 'e', 'a', 'r']
>>> name[1:] = list('ython') # 可以更改列表的长度,并添加替换
>>> name
['P', 'y', 't', 'h', 'o', 'n']

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4] # 可以不替换任何元素的情况下,插入新的元素
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = [] # 删除元素
>>> numbers
[1, 5]
>>> numbers[2:2] = [2] # 向最后的位置添加元素
>>> numbers
[1, 5, 2]

>>> numbers = [1, 2, 3, 4, 5]
>>> numbers[4:1:-2] = [6] # 加入步长,所赋值的元素前后数量要一致

Traceback (most recent call last):
  File "<pyshell#100>", line 1, in <module>
    numbers[4:1:-2] = [6]
ValueError: attempt to assign sequence of size 1 to extended slice of size 2
>>> numbers[4:1:-2] = [6,7]
>>> numbers
[1, 2, 7, 4, 6]
>>> numbers[4:1:-3] = [8]
>>> numbers
[1, 2, 7, 4, 8]

删除

del

删除指定位置的元素 del 语句:

>>> x
['h', 'e', 'l', 'l', 'o']
>>> del x[2]
>>> x
['h', 'e', 'l', 'o']

pop

要删除 list 末尾的元素,用 pop() 方法:

>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']

要删除指定位置的元素,用 pop(i) 方法,其中 i 是索引位置:

>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']

remove

remove 方法用于移除列表中某个值的第一个匹配项:

>>> x = [1, 2, 3, 4, 2]
>>> x.remove(2)
>>> x
[1, 3, 4, 2]
>>> x.remove(5) # 如果列表不存在该元素则报错

Traceback (most recent call last):
  File "<pyshell#122>", line 1, in <module>
    x.remove(5)
ValueError: list.remove(x): x not in list

循环中删除

# 删除 num_list 中为空的元素
num_list = [1, 2, 3, 4, None, 6, 7, 8, None, 10, 11, None, 13, 14, None]

# 方法一:使用逆序遍历
for i in range(len(num_list) - 1, -1, -1):
    if not num_list[i]:
        num_list.pop(i)
print(num_list)  # [1, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14]

# 方法二:使用逆序遍历,与一类似
num_list = [1, 2, 3, 4, None, 6, 7, 8, None, 10, 11, None, 13, 14, None]
for i in num_list[::-1]:
    if not i:
        num_list.remove(i)

print(num_list)  # [1, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14]

# 方法三:写入新列表中
num_list = [1, 2, 3, 4, None, 6, 7, 8, None, 10, 11, None, 13, 14, None]
new_list = []
for i in num_list:
    if i:
        new_list.append(i)

print(new_list)  # [1, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14]

# 方法四:列表推导式
new_list = [i for i in num_list if i]  # [1, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14]

# 方法五:使用 filter 和 lambda
new_list = list(filter(lambda x: x, num_list))  # [1, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14]

http://www.chenxm.cc/article/67.html

添加

appendinsertextend 方法会直接修改原来的列表,+ 连接不会修改原来的列表

append

可以往 list 中追加元素到末尾

>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

insert

也可以把元素插入到指定的位置,比如索引号为 1 的位置:

>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

extend

extend 方法可以在列表的末尾一次性追加另一个序列的多个值:

>>> a = [1]
>>> b = [2]
>>> a.extend(b)
>>> a
[1, 2]

>>> x = [1]
>>> y = [2]
>>> z = x + y
>>> z
[1, 2]
>>> x
[1]

>>> a = a + b # 效率要比extend低

也可以使用分片,但可读性低

>>> a = [1]
>>> b = [2]
>>> a[len(a):] = b
>>> a
[1, 2]

查找

index 方法用于从列表中找出某个值第一个匹配项的索引位置

>>> x = [1, 2, 3, 4]
>>> x.index(2)
1
>>> x.index(6) # 未找到引发异常

Traceback (most recent call last):
  File "<pyshell#126>", line 1, in <module>
    x.index(6)
ValueError: 6 is not in list

元素出现次数

count 方法统计某个元素在列表中出现的次数。

>>> x = [1, 2, 3, 4, 5, 2, 2]
>>> x.count(2)
3
>>> x.count(6)
0

反转

reverse 方法将列表中的元素反向存放,不返回值,直接修改列表

>>> x = [1, 2, 3, 4]
>>> x.reverse()
>>> x
[4, 3, 2, 1]

如果需要对一个序列进行反向迭代,可以使用 reversed 函数,返回一个迭代器对象,可以使用 list 转换成列表

>>> x
[4, 3, 2, 1]
>>> y = list(reversed(x)) # 不改变原本序列
>>> y
[1, 2, 3, 4]
>>> x
[4, 3, 2, 1]

>>> x[::-1]  # 也可以使用分片
[4, 3, 2, 1]

排序

sort

sort 方法修改原列表,不返回值

>>> x = [23, 523, 25, 3]
>>> x.sort()
>>> x
[3, 23, 25, 523]

如果要不改变原列表,则需要复制整个列表:

>>> x = [23, 523, 25, 3]
>>> y = x[:]
>>> y
[23, 523, 25, 3]
>>> y.sort()
>>> y
[3, 23, 25, 523]
>>> x
[23, 523, 25, 3]

sorted

另一种不改变原列表,获得已排序列表的方法。sorted 可以用于任何可迭代的对象。

>>> y = sorted(x)
>>> y
[3, 23, 25, 523]
>>> x
[23, 523, 25, 3]

Python2 自定义排序

可以通过 compare(x, y) 的形式自定义比较函数。在 x<y 时返回负数,在 x>y 时返回正数,在 x=y 时返回 0。定义好之后可以提供给 sort 方法作为参数了。内建函数 cmp 提供了比较函数的默认实现。

>>> cmp(43, 34)
1
>>> cmp(23, 34)
-1
>>> cmp(20, 20)
0
>>> x
[23, 523, 25, 3]
>>> x.sort(cmp)
>>> x
[3, 23, 25, 523]
def pmc(x, y): # 自定义比较函数,从大到小
    if x > y:
        return -1
    if x < y:
        return 1
    if x == y:
        return 0

>>> x.sort(pmc)
>>> x
[523, 25, 23, 3]

sort 的两个可选参数

keyreverse,如果要使用他们需要通过名字指定(关键字参数)。cmp, key, reverse 参数都可以用于 sorted 函数。

参数 key 和参数 cmp 类似,也是需要提供一个函数,然而,该函数不是直接用来确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。

如果需要根据元素长度进行排序,可以使用 len 函数作为键函数

x = ['12345', '123', '1234']
x.sort(key=len)
x
# ['123', '1234', '12345']

def acounts(x): # 自定义比较函数,根据'a'的数量排序
    return x.count('a')

>>> x = ['aa', 'a', 'aaa']
>>> x.sort(key=acounts)
>>> x
['a', 'aa', 'aaa']

# Python3 没有 cmp 函数,所以需要使用 key 参数
>>> random = [(2, 2), (3, 4), (4, 1), (1, 3)]
>>> random.sort(key=lambda x: x[1])
>>> random
[(4, 1), (2, 2), (1, 3), (3, 4)]

关键字参数 reverse,是简单的布尔值,用来指明列表是否要进行反向排序。

>>> x = [23,234,26,41]
>>> x.sort(reverse=True)
>>> x
[234, 41, 26, 23]

元组

元组不能修改,用圆括号()括起来,

>>> (1, 2, 3)
(1, 2, 3)
>>> ()
()
>>> (1) # 这个不是元组
1
>>> (1,) # 单个元组,必须要加逗号
(1,)
>>> 3 * (40 + 3)
129
>>> 3 * (40 + 3,)
(43, 43, 43)

tuple

可以将序列转换为元组

>>> tuple([1, 2, 3])
(1, 2, 3)
>>> tuple('asd')
('a', 's', 'd')

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:《Python基础教程》读书笔记02-列表和元组

文章字数:3k

本文作者:Bin

发布时间:2017-01-01, 16:25:22

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2017/01/01/Python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/%E3%80%8APython%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B002-%E5%88%97%E8%A1%A8%E5%92%8C%E5%85%83%E7%BB%84/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录