列表和元组的区别
-
列表即数组。
-
列表是可修改的,元组不可以。
-
列表适用于中途添加元素的情形,元组适用于禁止修改序列的情形。
-
列表可以代替元组,除了将元组运用于 字典键 ,因为字典键是不允许修改的。
数据结构的基本概念——容器(container)
容器:可以包含其他对象的对象。
容器包括序列(列表、字符串和元组)、映射(如字典)、集合(set)。
- 序列中,每个元素都有编号,从编号0开始。
- 映射中,每个元素有名称,即键。
- 集合也是容器,它既不是序列,也不是映射。
通用的序列操作
1.索引(indexing)
>>>greeting = 'hello'
>>>greeting[0]
‘h’
>>>greeting[-1]
'o'
python中没有字符类型,一个字符就是包含一个元素的字符串。
字符串字面量,可以直接执行索引操作,不用先赋值给变量
>>>'hello'[1]
'e'
如果函数调用返回一个序列,可以直接索引:
>>>fourth = input("year:")[3]
year:2019
>>>fourth
'9'
2.切片(slicing)
-
索引访问单个元素,切片提取范围内的一部分元素。
-
序列的第一个索引是0
-
两个索引确定切片边界,前一个索引包含在内,后一个索引不包含。
>>>num = [1,2,3,4.5,6,7,8,9,10] >>>num[3:6] [4,5,6] >>>num[0:1] [1]
如果要从列表末尾开始数,可以用负数。
负数索引从 -1 开始。
>>>num = [1,2,3,4.5,6,7,8,9,10]
>>>num[-3:-1]
[8,9]
负数索引,这样无法到达最后一个元素。
>>>num = [1,2,3,4.5,6,7,8,9,10]
>>>num[-3:0]
[]
出现这种情况是因为:
第一个索引元素位于第二个索引元素的后面,
这种情况就为空列表。
那么如何索引到最后一个元素呢?
可采用简写法。
-
切片位于序列末尾,可省略第二个索引
-
切片位于开头,可省略第一个索引
>>>num = [1,2,3,4.5,6,7,8,9,10] >>>num[-3:] [8,9,10] >>>num[:3] [1,2,3]
如果要复制整个序列,可以将两个索引都省略:
>>>num[:]
[1,2,3,4,5,6,7,8,9,10]
更改步长[第一个索引:第二个索引:步长]
步长不写的话,默认为1
>>>num = [1,2,3,4.5,6,7,8,9,10]
>>>num[0:10:1]
num = [1,2,3,4.5,6,7,8,9,10]
>>>num[0:10:2]
[1,3,5,7,9]
>>>num[3:6:3]
[4]
>>>num[::4]
[1,5,9]
步长不能为0,但是可以为负数,即从右向左提取元素。
步长为负数时,前一个索引的元素,要在后一个索引的元素后面,否则为空序列。
>>>num = [1,2,3,4.5,6,7,8,9,10]
>>>num[8:3:-1]
[9,8,7,6,5]
>>>num[10:0:-2]
[10,8,6,4,2]
>>>num[0:10:-2]
[]
>>>num[::-2]
[10,8,6,4,2]
>>>num[5::-2]
[6,4,2]
>>>num[:5:-2]
[10,8]
3.序列相加
不同类型的序列不能相加,比如字符串和列表不能相加。
4.序列相乘
>>>'python' * 5
'pythonpythonpythonpythonpython'
>>>[42]*10
[42,42,42,42,42,42,42,42,42,42]
[]表示空列表,None表示什么都没有,可用于初始化。
比如初始化长度为10的列表,这时列表中就没有添加任何元素:
>>>sequence[None]*10
5.成员资格(in)
检查特定的值是否包含在序列中,可使用布尔运算符in。
>>>permissions = 'rw'
>>>'r' in permission
true
>>>'x' in permission
false
可在unix中检查文件的写入和执行权限
可以检查一个字符串是否是另一个字符串的子串
>>>users = ['mlh','foo','bar']
>>>input('enter your name:') in users
enter your name:bar
true
可以检查用户身份,有时还需检查密码
>>>subject = '$$$ get rich now!!! $$$'
>>>'$$$' in subject
>true
过滤垃圾邮件
基本列表操作
1.list函数
>>>list('hello')
['h','e','l','l','o']
任何序列都可以作为list的参数。
>>>''.join( ['h','e','l','l','o'])
'hello'
2.修改列表
>>>x = [1,1,1]
>>>x[1] = 2
>>>x
[1,2,1]
3.删除列表(del)
>>>x = [1,2,3]
>>>del x[2]
>>>x
[1,2]
3.给切片赋值
>>>name = list('perl')
>>>>name[1:] = list('ython')
>>>name
['p','y','t','h','o','n']
不替换原有元素,给切片插入新元素:
>>>num = [1,5]
>>>num[1:1] = [2,3,4]
>>>num
[1,2,3,4,5]
删除切片:
>>>num = [1,2,3,4,5]
>>>num[1:4] = [] 等效于 del num[1:4]
>>>num
>>>[1,5]
列表方法
方法调用:object.method(arguments)
1.append
将一个对象附加到列表末尾
>>>x= [1,2,3]
x.append(4)
[1,2,3,4]
2.clear
清空列表
>>>x=[1,2,3]
x.clear()
[]
3.copy
通过copy复制表。
>>>a = [1,2,3]
>>>b = a
>>>b[1] = 1
a = [1,4,3]
b = [1,4,3]
>>>a = [1,2,3]
>>>b = a.copy()
>>>b[1] = [4]
a = [1,2,3]
b=[1,4,3]
也可以用切片a[:],list(a)复制表
4.count
计算指定元素出现了多少次
>>>x=[1,2,[1],3,[1,2],1]
>>>x.count(1)
2
5.extend
将多个值附加到列表末尾
>>>a= [1,2,3]
>>>b = [4,5,6]
>>>a.extend(b)
a = [1,2,3,4,5,6]
有点像拼接,但是原序列a改变了,拼接的话不改变a。
如果要改变a,还要使用a = a + b,效率比extend低
切片可以实现和extend相同的效果
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>a[len(a):] = b
a = [1,2,3,4,5,6]
但是这种方法可读性不高
6.index
查找指定值第一次出现的索引
>>>x=[1,2,3,4]
>>>x.index(3)
2
如果没有找到这个元素,将出现ValueError异常。
7.insert
将一个对象插入列表
>>>x = [1,2,3,4,5]
>>>x.insert(3,'helllo')
x = [1,2,3, "hello", 4,5]
这用切片赋值也可以实现,但是可读性差:
>>>x=[1,2,3,4,5]
>>>x[3:3] = ['hello']
[1,2,3,'hello',4,5]
8.pop
删除一个元素(默认为最后一个),并返回这个元素
>>>x = [1,2,3]
>>>b=x.pop()
b=3
>>>b=x.pop(0)
b=1
>>>b=x.pop(0)
b=2
pop是唯一一个修改列表又返回非None值的列表方法。
python中没有push,和pop相反的是append:
>>>x=[1,2,3]
>>>x.append(x.pop())
x= [1,2,3]
9.remove
可用于删除第一个指定元素
>>>x= [1,2,3,4,3,4]
>>>x.remove(3)
x=[1,2,4,3,4]
10.reverse
倒序排列
>>>x=[1,2,3]
>>>x.reverse()
x=[3,2,1]
还可以使用函数reversed,这个函数不返回列表,而是返回一个对象(迭代器),可以用list把返回的对象转换成列表。
>>>x=[1,2,3]
>>>list(reversed(x))
x=[3,2,1]
11.sort
按顺序排列元素
>>>x= [4,6,2,1,7,9]
>>>x.sort()
x=[1,2,4,6,7,9]
sort也不返回任何值,常见的错误思维:
>>>x=[1,4,6,2,5]
>>>y=x.sort()
>>>print(y)
None
x按顺序排序了,y接收了返回值,为None
其中一种正确的方法是复制一个表:
>>>x=[4,6,2,1,7,9]
>>>y=x.copy()
>>>y.sort()
>>>print(y)
y=[1,2,4,6,7,9]
另一种解决办法是使用sorted:
>>>x= [4,6,2,1,7,9]
>>>y=sorted(x)
x=[4,6,2,1,7,9]
y=[1,2,4,6,7,9]
这个函数可以用于任何序列,但总是返回一个列表
>>>sorted('Python')
>>>['P','h','n','o','t','y']
12.高级排序
sort方法的两个可选参数key和reverse。
key参数为每个元素创建一个键,再进行排序。比如,要根据长度排序,就把参数key设置为函数len:
>>>x= ['a','fefa','ad']
>>>x.sort(key=len)
x=['a','ad','fefa']
参数reverse的值为True和False,True代表反序,注意首字母大写。
>>>x= ['a','fefa','ad']
>>>x.sort(key=len,reverse=True)
x=['fefa','ad','a']
元组——不可修改的序列
将一些值用逗号分隔,就能自动创建元组
>>>1,2,3
(1,2,3)
>>>(1,2,3)
(1,2,3)
#空元组
>>>()
()
#创建包含一个值的元组
>>>42
42
>>>42,
(42,)
>>>(42,)
(42,)
仅仅加上一个逗号,句子的含义完全不一样:
>>>3*(40+2)
126
>>>3*(40+2,)
(42,42,42)
1.函数tuple将序列转换为元组,就像list将序列转换为列表一样:
>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')
tuple((1,2,3))
(1,2,3)
2.元组的访问:
>>>x=1,2,3
>>>x[1]
2
>>>x[0:2]
1,2
3.元组的应用
- 用作映射中的键(以及集合中的成员)而列表不行
- 有些内置函数和方法返回元组,只要不尝试修改元组,就像处理列表一样处理就行,但是如果要使用元组没有的index和count方法时除外。
- 一般而言,列表足以满足对序列的需求。