开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情。
一、什么是列表和元组
Python中的列表和元组就对应于其它编程语言的数组。
列表和元组的大部分功能都差不多,但有一个非常重要的差异,就是列表中的元素可变,创建以后随时可以修改;而元组中国内的元素不可变,创建以后无法修改,如果非要修改,只能重新创建一个元组。
二、列表的创建、访问和修改
1.创建列表
可以直接用[]表示一个列表,也可用list这一内置函数来创建,具体如下。
# 创建列表
# []表示一个空列表
list1 = []
list2 = list()
print(type(list1))
print(type(list2))
运行结果如下,可知list1、list2均是列表类型。
- 列表在用[]创建时可以直接给定初始值
- 同一个列表里可以放不同类型的变量(这里和C/C++的数组差别很大)
- 用print可以直接打印列表中的全部内容
# 可以在创建时直接给定初始值
list1 = [1, 2, 3, 4]
print(list1) # 可以直接打印列表的全部内容
# 列表里可以放不同类型的数据
list2 = [1, 'hello', True, [2, 3, 4]]
print(list2)
运行结果如下。
2.下标访问
列表里可以管理很多元素,通过下标来访问到列表中的元素,注意用下标访问时操作符也是[],可读可写,像C/C++访问数组时的[]一样,而且下标同样也是从0开始计的。
list2 = [1, 'hello', True, [2, 3, 4]]
print(list2)
print(list2[0]) # 读
print(list2[2]) # 读
list2[1] = 'world' # 写
print(list2)
运行结果如下,下标不仅可以读出列表内的数据,也可进行修改。
Python的列表用下标访问时,下标为负数,具体看下面的代码及注释。
a = [1, 2, 3, 4, 5]
print(len(a)) # len函数返回列表a的长度
print(a[-2]) # 下标为-2,等价于len(a) - 2
print(a[len(a) - 2]) # 访问倒数第二个元素
3.切片
通过下标一次可以取出一个列表数据,而通过切片一次可以取出若干个列表数据,也即取出一个子列表,所以切片其实就是多次下标操作的重复。
a = [1, 2, 3, 4]
print(a[1:3]) # 结果为2,3
切片操作中,[1:3]表示了一段区间,1表示区间开始的下标,3表示区间结束的下标,这个区间同样是左闭右开的,所以最后的结果为2,3。
下面是切片的一些其他写法。
a = [1, 2, 3, 4]
print(a[1:3])
print(a[1:]) # 省略右边界,即取到整个列表结束
print(a[:3]) # 省略左边界,即从整个列表开始取
这里要说明切片是一个比较高效的操作,在进行切片时只是取出了原有列表中的一部分,而不涉及数据的拷贝。
切片时还可以指定步长,步长也可以为负数,表示从后往前取。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[0:11:1])
print(a[::2]) # 从头取到尾,步长为2
4.循环遍历列表
for i in range(0, len(a)):
a[i] += 10
print(a)
要注意下面这种循环,将a中的元素赋值给data后对data的操作不会影响到a,而上面直接通过下标访问是可以直接对a修改的。
a = [1, 2, 3, 4, 5]
for data in a:
data += 2
print(data)
print(a)
5.插入数据
(1)append
首先要注意这里的append并不是一个独立的函数,它要通过列表创建出的对象来调用,实际是一个对象的方法(类比C++中的类)。
append的作用是直接在列表的末尾插入数据。
# 1.append在末尾插入数据
a = [1, 2.2, 3, 4]
print(a)
# 注意append的调用方式,通过.来使用
a.append(5) # 在列表末尾插入整型5
a.append("hello") # 在列表末尾插入字符串"hello"
print(a)
在列表末尾依次插入整型5和字符串"hello"。
(2)insert
insert同样是通过一个列表对象来调用,它的作用是在列表的指定位置插入一个数据。
# 2.insert在任意位置插入数据
a = [1, 2.2, 3, 4]
print(a)
a.insert(1, 'hello') # 在下标为1(从0开始)的位置插入'hello'
# 插入的位置超出列表长度,直接在末尾加入数据
a.insert(20, 200)
print(a)
需要注意的是列表的下标仍是从0开始,并且如果指定的位置比列表的长度更大,那么插入的位置就是列表的最后,此时insert的作用与append相同。
6.查找数据
(1)in和not in
in和not in不是列表的方法,所以调用时不需要像插入数据时调用的append和insert一样使用列表对象。
in表示某个元素在列表中,not in表示某个元素不在列表中,返回值是一个布尔类型,即True或False。
# 1.使用in和not in来判断某个元素是否在列表中
# 返回True或False
a = [1, "python", 3.14]
print(1 in a)
print(5 in a)
print("C" in a)
print(2 not in a)
运行结果如下,结果很容易理解。
(2)inedx
index是列表的方法,需要通过列表对象来访问。
若查找的数据存在,则返回值是对应数据在数组中的下标,若不存在则抛出异常。
这里要注意与C/C++中的查找操作区分,它们在查找不到数据时返回-1,因为-1在这些语言中针对数组时是无意义的。而Python的列表中-1是有意义的,所以不会返回-1,要注意区分。
# 2.使用index来判定当前元素是否存在
# 若存在则返回下标,否则抛出异常
a = [1, "python", 3.14]
print(a.index('python')) # 存在,返回下标
print(a.index(9)) # 不存在,抛异常
7.删除数据
(1)pop
用pop来删除数据,不传入参数时删除列表末尾的数据,传入参数(下标位置)时删除对应位置的数据,若下标超出列表范围则抛出异常。
# 1.用pop删除列表末尾的数据
a = [1, 2, 3, 4]
a.pop() # 删除4
print(a)
# 2.用pop删除列表任意位置的数据
a = [1, 2, 3, 4]
a.pop(1) # 删除下标为1的数据,即整型2
print(a)
a.pop(50) # 抛异常
print(a)
(2) remove
remove可以针对列表中指定的值进行删除,若列表中不存在指定的值会抛出异常。
# 3.remove删除指定的值
a = ['1', 'a', '3']
a.remove('1')
print(a)
a.remove(1)
print(a)
8.列表的拼接
(1)+
使用+拼接时,拼接的结果是一个新的列表,不会影响原来的列表。
# 列表拼接
# 1.+
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(a)
print(b)
print(c)
可以看到a、b均未发生变化,生成的c是一个全新的列表。
(2)extend
# 2.extend
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
print(a)
print(b)
a通过.调用了extend,将b列表添至a之后,a列表被改变,b列表仍不变。
(3)+=
+=的逻辑与extend基本相同,但是底层实现差异很大,这里暂且不深入介绍。
# 3. +=
a = [1, 2, 3]
b = [4, 5, 6]
a += b
print(a)
print(b)
三 、元组
1.元组的创建和访问
关于元组的创建和访问,与列表基本相同,可以类比关于列表的介绍进行学习,下面仅给出例子和必要的介绍,不过多赘述。
(1)创建
# 1.用()来创建元组
a = (1, 2, 3)
print(type(a))
print(a)
b = tuple()
print(type(b))
print(b)
(2)访问
切片
注意下标从0开始,以及区间的左闭右开。
# 1.切片
a = (1, 2, 3, 4)
print(a[1:3])
循环
注意语法格式。
# 2.for循环
a = (1, 2, 3, 4)
for data in a:
print(data)
查找
# 3.in和index查找
a = (1, 2, 3, 4)
print(3 in a)
print(a.index(2))
拼接
# 4. +和+=
a = (1, 2, 3)
b = (4, 5)
c = a + b
print(a)
print(b)
print(c)
a += b
print(a)
print(b)
(3)修改
由于元组只能读不能写,所以上述列表中各种修改数据的方法、函数都无法在元组下使用,这是二者最大的区别。