2.列表、元组、容器、序列操作【python基础教程第三版 笔记】

列表和元组的区别

  • 列表即数组。

  • 列表是可修改的,元组不可以。

  • 列表适用于中途添加元素的情形,元组适用于禁止修改序列的情形。

  • 列表可以代替元组,除了将元组运用于 字典键 ,因为字典键是不允许修改的。

数据结构的基本概念——容器(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方法时除外。
  • 一般而言,列表足以满足对序列的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值