《Python基础教程第二版》第二章-Python列表和元祖
序列
例:
Edward = ['abc', 12]
序列中的所有元素都是有编号的,从0开始递增。
Note: 使用负数索引-1,Python会从右边,也就是从最后一个元素开始计数。最后一个元素的位置编号是-1.
索引操作
字符串、函数可以直接对返回结果进行操作
‘hello’[1] fo = raw_input('year: ')[2]
分片
分片通过冒号:
隔开两个索引。
代码:
numbers = [1, 2, 3, 4] number[1:2]
输出:
[2, 3]
第一个索引:
提取的第一个元素的编号
第二个索引:
分片之后,剩余部分的第一个元素的编号。 Note:分片第二个索引指向的元素取不到。
简而言之:
分片操作的实现需要两个索引作为边界。 第一个索引元素是包含在分片内的。 第二个索引元素不在分片内。
思考:
numbers = [1,2,3,4,5,6,7,8,9,10] 如何访问最后3个元素。
1.显示操作
numbers[7:10] #索引10指向第11个元素,第11个元素不存在。为了让分片包含最后一个元素,必须提供最后一个元素的下一个元素的索引作为边界。
2.从尾开始计数(不可行)
numbers[-3:-1] #无法访问最后一个元素
3.使用索引0访问最后一个元素(不可行)
numbers[-3:0] #只要分片最左的索引比右边的晚出现在序列中,一律返回空序列。
4.置空最后一个索引(优雅,推荐)
numbers[-3:]
同样适用序列开始的元素:
numbers[:3]
复制序列
复制整个序列,将两个索引都置空。
number2 = numbers[:] note: number2 = numbers #不可行,会将number2与numbers指向同一个序列
步长
第三个参数是步长。Python中默认步长为1.
numbers[0:10:2] #取步长为2,取间隔为1个元素的分片。
Note:
步长不能为0。 负数步长,分片从右到左提取元素。
序列加法、乘法
endings = ['st','nd',‘rd’] + 17*['th']\ + ['st','nd',‘rd’] + ['th']*7 #17*['th']表示17个['th']
空列表、None
空列表
[]
用None初始化
seq = [None]*10
成员资格
in运算符:布尔运算符,检查值是否在序列中。
subject = '$$$ abssdjk $$$!' '$$$' in subject users = ['bob','jack'] raw_input('your name:') in users
长度、最小值和最大值
内建函数
len、min、max
len
函数
返回序列中所有包含元素的数量
min
函数、max
函数
返回序列中最大和最小的元素
Note:
序列包括: 列表、字符串、元组 故:以上序列的特种对于列表字符串和元组都适用。
列表
列表可以修改:
- 元素赋值
- 元素删除
- 分片赋值
- 列表方法
list函数
用于创建列表,适用于所有类型的序列,例如字符串
例:
list('hello')#根据字符串创建列表['h','e','l','l','o']
列表转字符串
''.join(somelist)
列表基本操作
1. 元素赋值 2. 删除元素 3. 分片赋值
1. 元素赋值
x = [1,2,3] x[1] = 6
2. 删除元素
names = ['bob','jack','afra'] del names[2] #列表长度减一
3. 分片赋值
name = list('afra') name[1:] = list('lpha')
分片赋值:
1.可以使用与原序列不等长的序列将分片替换
name = list('perl') name[1:] = list('ython')
2.可以在不需要替换任何原有元素的情况下插入新元素
number = [1,5] number[1:1] = [2,3,4]
3.可以删除元素
number = [1,2,3,4,5] number[1:4] = []
列表方法
方法:
一个与某些对象有紧密联系的函数。
方法调用:
对象.方法(args)
列表方法
1.append 2.count 3.extend 4.index 5.insert 6.pop 7.remove 8.reverse 9.sort 10.高级排序
1.append
在列表末尾追加新对象,直接修改原列表
number = [1,2,3] number.append(4)
2.count
统计某个元素在列表中出现的次数
x = [1,1,2,2,2,3] x.count(1)
3.extend
在列表末尾一次性追加另一序列的多个值。即:用新列表扩展原因的列表。
Note:
extend和连接操作'+'的区别: extend方法修改了序列 原始的连接操作不修改序列,返回一个全新的列表 连接操作效率比extend方法低
4.index
从列表中找出某个值第一个匹配项的索引位置
knight = ['hao','a'] knight.index('hao')
5.insert
将对象插入到列表中。
numbers = [1,2,3] number.insert(3,'four')
6.pop
移除列表中的一个元素(默认最后一个),返回该元素的值。
pop方法是唯一修改列表又返回元素值的列表方法。
Python中实现栈:,出栈pop
,入栈append
。
x[1,2,3,4] x.pop() x.pop(0)
Note:在JavaScript中,pop只弹出栈顶值,不会返回栈顶值,可使用top()获取栈顶值
7.remove
移除列表中某个值的第一个匹配项。修改列表,没有返回值。
x = ['i','want','to','to'] x.remove('to')
8.reverse
将列表倒置。改变列表,没有返回值。
x = [1,2,3] x.reverse()
9.sort
在原位置对列表排序。修改列表,返回None。
x = [8,7,2,43,45] x.sort()
思考:
用户需要一个排好序的列表副本,但是保留原有列表不变。
思路:
把x的副本赋值给y,对y进行排序。
代码:
x = [1,2,4,5,6,1,23,2,2,3,] y = x[:] y.sort() #强调:x[:]是一种很有效率的复制整个列表的方法。只是简单的把x赋值给y,会让x和y都指向同一个列表。
使用sorted
函数
#获取已排序的列表的副本 x = [1,3,4,5,2] y = sorted(x) #note:sort()是列表方法,sorted是函数
10.高级排序
1.cmp自定义比较函数
numbers.sort(cmp)
2.key 为每个元素创建一个键,根据键排序
numbers.sort(key = len)
3.reverse = true
numbers.sort(reverse = true)
元组
圆括号表示,不可修改
(1,2,3)
空元组
()
一个值的元组
(42,)
Note:
必须加逗号,即使只有一个值。逗号非常重要。 (4+2) #不是元组 (4+2,) #是元组
tuple
函数
一序列作为参数转换为元组
tuple([1,2,3])#(1,2,3) tuple('abc')#(a,b,c)