写在前面:
Python支持一种数据结构的基本概念,名为容器(container)。容器基本上就是可包含其 他对象的对象。两种主要的容器是序列(如列表和元组)和映射(如字典)。这次我们主要来了解一下 列表和元组。
在介绍这些之前,我先来给大家介绍一下所有的序列都有支持的以下操作:
序列
有几种操作适用于所有序列,包括索引、切片、相加、相乘和成员资格检查。另外,Python 还提供了一些内置函数,可用于确定序列的长度以及找出序列中大和小的元素,关于迭代会在以后介绍。
1.索引
序列中的所有元素都有编号——从0开始递增。你可像下面这样使用编号来访问各个元素:
例如:
def Test1():
str1 = 'hello'
print(str1[1])
l1 = [1, 2, 3, 4]
print(l1[2])
Test1()
注意:
字符串就是由字符组成的序列。索引0指向第一个元素,这里为字母h。不同于其他一些语言,Python没有专门用于表示字符的类型,因此一个字符就是只包含一个元素的字符串。
而在python 中还支持 (索引)下标为负数 的操作 例如:

这在python是被允许的操作 ,但是在其他C/C++就不允许,这种索引方式适用于所有序列。当你使用负数索引时,Python将从右(即从最后一个元素)开始往左数,因此 -1是后一个元素的位置,-3 也就是倒数第三个的位置。
另外序列的索引还可以被多种方式使用:
l1 = [1, 2, 3, 4]
l1[3] = 9
print(l1)# 对序列中的索引位置的值进行修改
print('hello'[3])# 直接打印出序列 'hello' 的索引为 3位置的值 无需再创建一个新的序列变量
fourth = input("请输入: ")[3]##返回用户输入的第四个的值
print(fourth)2.切片
除使用索引来访问单个元素外,还可使用 “切片(slicing)” 来访问 "特定范围内 "的元素。为此, 可使用两个索引,并用冒号分隔:
这个切片也就是通过索引的分割来确定一个范围 由此对序列中的内容进行访问,修改等操作。
例如:
def Test2():
str1 = "hello world!"
print(str1[1:6])
Test2()
也就是对于序列,提供两个索引来指定切片的边界,其中第一个索引指定的元素包含在切片内, 但第二个索引指定的元素不包含在切片内。
[ 1: 6]也就是 包含了索引为 1 2 3 4 5 的五个元素。当然上述的 负索引也是支持的,同时还有一些下面的比较特殊的操作。
1. 索引的特殊使用方法:
def Test3():
a = [1, 2, 3, 4, 5, 6, 7, 8]
print(a[1:-2])# 切片也同样支持负索引的操作 但是也要注意正负索引不要超出序列的范围
print(a[-4:-1])#打印最后三个元素 可以使用负索引来解决 非常的方便 当然还有以下的一些更为简洁的操作
print(a[-4:])#打印最后四个元素 这里 可以省略第二个索引
print(a[:3])#打印前三个元素 这里可以省略第一个索引
print(a[:])#打印出整个序列
Test3()
2. 步长
其实在使用切片操作时,为了优化这个操作,这其中还有另外一个参数 “步长” 也就是 我们通过两个索引获取范围内的元素时 是按照一次递增一个的访问的 ,其实我么可以通过参数的设置,使其按一次间隔一个或n个的获取范围内的元素,例如:
def Test4():
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(b[0:10:2])
print(b[1:10:2])
print(b[0:10:3])
Test4()
注意:
步长不能为0,否则无法向前移动,但可以为负数,即从右向左提取元素。
当然如果是要从整个序列中j间隔n-1个地获取元素 也可以简写为 b[ : : n]
3.序列相加
可使用加法运算符来拼接序列,但是一般而言,不能拼接不同类 型的序列。

4.乘法
将序列与数x相乘时,将重复这个序列x次来创建一个新序列:

None、空列表和初始化
def Test6():
a = []
print(a)#一个空的序列
b = [None]*10#使用 None 来初始化
print(b)
Test6()
5.成员资格
要检查特定的值是否包含在序列中,可使用运算符in。
它检查是否满足指定的条件,并返回相应的值:满足时返回True, 不满足时返回False这样的运算符称为布尔运算符,而前述真值称为布尔值。
例如:

6.长度、最小值和最大值
内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返 回序列中小和大的元素

一、列表:
列表是最常用的Python数据类型,有点像 c /c++中的数组 但是它与数组还有些不同,它可以作为一个方括号内的逗号分隔值出现。 例如:
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
a = [1, 'f', 3]其实在上述的序列的一些中我们可以体会到列表
通常具备以下几个特点:
列表由一系列按特定顺序排列的元素组成。
列表长度不确定。
列表中存储的元素类型可以不唯一。
列表中可以有重复元素。
1. 列表的基本操作
1. 修改列表:给元素赋值
如:
a = [1, 3, 4]
a[2] = 5#将索引为 2 的元素修改为 5注意:
不能给不存在的元素赋值,因此如果列表的长度为2,就不能给索引为100的元素赋值。 要这样做,列表的长度至少为101
2. 删除元素
使用del语句即可。
如:
a = ['w', 1, 4]
del a[0] #即可删除第一个元素 且长度也会发生改变3. 给切片赋值
例如:

l例如当给一个空的切片 如 a[1: 1] 相当于插入段数据 当把一段范围内的数据替换为 [ ]时也就相当于删除一段数据
2.列表方法
方法 | 方法介绍 |
append | 将一个对象附加到列表末尾。 |
clear | 就地清空列表的内容 |
copy | 复制列表。 |
count | 计算指定的元素在列表中出现了多少次 |
extend | 将多个值附加到列表末尾 |
index | 在列表中查找指定值第一次出现的索引 |
insert | 将一个对象插入列表 |
pop | 从列表中删除一个元素(末尾为后一个元素),并返回这一元素。 |
remove | 删除第一个为指定值的元素。 |
reverse | 按相反的顺序排列列表中的元素 |
sort | 对列表就地排序①。就地排序意味着对原来的列表进行修改,使其元素按顺序 排列,而不是返回排序后的列表的副本 |
具体的请看代码演示:
#### 1.append 尾加一个数据
numbers.append(6)
print(numbers)#[1, 4, 5, 6]
#### 2.clear清空
print(numbers)#什么也没有
#### copy
a = [1, 2, 3]
b = a.copy()
print(b)#[1, 2, 3]
#### count 计算一个元素出现的次数
y = b.count(2)
print(y)#1
#### 相当于将整个 列表 b 附加到 a 后面 返回的是被追加的列表 但是使用 + 的话会返回一个新的 列表
a.extend(b)
print(a)#[1, 2, 3, 1, 2, 3]
#### 6. index 方法index在列表中查找指定值第一次出现的索引 当不存在的时候会报错
knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
temp = knights.index('who')
print(temp)#4
#### 7. insert 方法insert用于将一个对象插入列表。
##### objec.insert(pos,value)
str1 = ["h", "e", "l", "o"]
str1.insert(3, 'l')
print(str1)#['h', 'e', 'l', 'l', 'o']
#### 8. pop 方法pop从列表中删除一个元素(末尾为后一个元素),并返回这一元素
### python中没有 push 因此使用 pop 和 insert 或者 append 可以实现一个简单的 栈
str1.pop()# l
print(str1.pop())
print(str1)#['h', 'e', 'l', 'l']
#### 9. remove 方法remove用于删除第一个为指定值的元素。
str2 = ['w', 'o', 'w', 'r', 'l', 'd']
str2.remove('w')
print(str2)#['o', 'w', 'r', 'l', 'd']
#### 10. reverse 方法reverse按相反的顺序排列列表中的元素 修改列表但是不返回任何的值
str2.reverse()
print(str2)#['d', 'l', 'r', 'w', 'o']
#### 11. sort 方法sort用于对列表就地排序①。
#### 就地排序意味着对原来的列表进行修改,使其元素按顺序 排列,而不是返回排序后的列表的副本。
arry = [1,5,7,342,43,37]
#arry.sort()
print(arry)##[1, 5, 7, 37, 43, 342]
###!!!! 注意上述的很多操作时没有返回值的 因此想要返回值的时候 可以先将其 使用 copy 出一个副本 对他的副本进行操作
## 再将其副本 返回即可如:
arry2 = arry.copy()
arry2.sort()
print(arry2)## [1, 5, 7, 37, 43, 342]
### 但是直接赋值是不行的 比如 将 y = x这样 x y还是指向同一个列表 但是可以使用 sorted 如:
arry3 = sorted(arry)
print(arry)## [1, 5, 7, 342, 43, 37]
print(arry3)##[1, 5, 7, 37, 43, 342]
### sorted 适合于所有的序列 返回的是一个列表
#####12. 高级排序 方法sort接受两个可选参数:key和reverse
arry4 = ["hr", "dka", "s", "sdgafkhl"]
arry4.sort(key=len)
print(arry4)##['s', 'hr', 'dka', 'sdgafkhl']
arry5 = [-1, 0, 131, 34, 4]
arry5.sort(reverse=True)##[131, 34, 4, 0, -1]
print(arry5)二、 元组
与列表一样,元组也是序列,唯一的差别在于元组是不能修改的(你可能注意到了,字符串 也不能修改)。
元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。
print(1, 2, 3)##元组还可以使用 ( ) 来进行创建
print(3*(1, 2, 3))##(1, 2, 3, 1, 2, 3, 1, 2, 3)
##tuple 它将一个序列作为参数,并将其转换为元组
arr6 = [1, 4, 7, 9, 34]
print(tuple(arr6))##(1, 4, 7, 9, 34)元组并不太复杂,而且除创建和访问其元素外,可对元组执行的操作不多。 元组的创建及其元素的访问方式与其他序列相同。
元组的切片也是元组,就像列表的切片也是列表一样。为何要熟悉元组呢?原因有以下两个。
它们用作映射中的键(以及集合的成员),而列表不行。映射将在以后详细介绍。
有些内置函数和方法返回元组,这意味着必须跟它们打交道。只要不尝试修改元组,与 元组“打交道”通常意味着像处理列表一样处理它们(需要使用元组没有的index和count 等方法时例外)。 一般而言,使用列表足以满足对序列的需求
















