[Python学习日记-15] 细讲数据类型——列表
简介
在[Python学习日记-7] 初识基本数据类型(下)中我们简单介绍了 Python 中的数据类型——列表,而在本篇中我们将展开介绍这一种数据类型。在这里我们简单回顾一下什么是列表。
定义:[] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素
列表的特点:
1.可存放多个值
2.Python 中的列表是一种有序的,按照从左到右的顺序定义列表元素,下标从0开始顺序访问
3.Python 中的列表是一种可变的,可修改指定索引位置对应的值
4.Python 中的列表几乎可以无限大,这取决于计算机的内存
列表的创建
# 直接中括号创建
names = ["Jove","Kerry"]
# 通过 list() 创建
names = list(["Jove","Kerry","Eva"])
代码输出如下:
列表的增删改查
一、增
1、追加,数据会追加到尾部
names = ['Jove','Kerry']
names.append("rain")
names.append("eva")
print(names)
代码输出如下:
2、插入,可插入任何位置
names = ['Jove','Kerry','rain','eva']
names.insert(2,"小猪佩奇")
print(names)
代码输出如下:
3、合并,可以把另一外列表的值合并进来
names = ['Jove', 'Kerry', '小猪佩奇', 'rain', 'eva']
n2 = ["张三","李四","狗蛋"]
names.extend(n2)
print(names)
代码输出如下:
4、列表嵌套
names = ['Jove', 'Kerry', '小猪佩奇', 'rain', 'eva', '张三', '李四', '狗蛋']
names.insert(2,[1,2,3])
print(names)
print(names[2][1]) # 读取嵌套的列表
代码输出如下:
二、删
1、del 直接删
names = ['Jove', 'Kerry', [1, 2, 3], '小猪佩奇', 'rain', 'eva', '张三', '李四', '狗蛋']
del names[2]
print(names)
代码输出如下:
2、pop 删
names = ['Jove', 'Kerry', '小猪佩奇', 'rain', 'eva', '张三', '李四', '狗蛋']
names.pop() # 默认删除最后一个元素并返回被删除的值
print(names)
names.pop(1) # 删除指定元素
print(names)
help(names.pop) # 显示帮助
代码输出如下:
注意:pop() 在列表为空时会报错
3、clear 清空
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四']
n2 = ['张三', '李四', '狗蛋']
n2.clear()
print(n2)
代码输出如下:
4、remove 删除从左到右找到的第一个元素
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四','eva']
names.remove("eva")
print(names)
代码输出如下:
注意:若要删除的值不存在则会报错
三、改
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四']
names[0] = "Kerry"
names[-1] = "李五"
print(names)
代码输出如下:
四、查
1、使用列表的方法查询
names = ['Kerry', '小猪佩奇', 'rain', 'eva', '张三', '李五']
names.index("eva") # 返回从左开始匹配到的第一个 eva 的索引
names.count("eva") # 返回列表中 eva 的个数
代码输出如下:
注意:index() 如果查找的元素不存在于列表当中,会报错说列表中不存在该元素;而 count() 没有找到将不会报错,而是显示0
2、直接查在不在列表
"eva" in names
代码输出如下:
3、把列表全取出来
print(names[:]) # 相当于 names[0:]
代码输出如下:
列表的切片(核心)
切片就像切面包,可以同时取出元素的多个值
names[start:end]
1、正着切
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四','eva']
print(names[1:4]) # 不包含序号为4的元素
print(names[1:-2])
print(names[1:]) # 把最后的都取出来
print(names[:4]) # 左边不写代表从0开始
代码输出如下:
注意:切片的特性是顾头不顾尾,即 start 的元素会被包含,end-1 是实际取出来的值(end 的元素不会被包含)
2、倒着切
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四','eva']
print(names[-5:-1])
代码输出如下:
可以看到这里面只打印了4个,其实想要的是后面5个,而“eva”这个值并没有打印出来,这是因为前面提到的列表特性,顾头不顾尾 ,可是想把后5个全取出来如何做呢?
print(names[-5:]) # 只需要不输入结尾的序号就可以直接取出后5位了
代码输出如下:
3、步长
步长字面意思就是步子的长度,在列表当中也是如此,只不过默认的步长是1,所以切片的时候是一个个切的,我们通过步长的设置可以实现两个两个切、三个三个切...这样跳着切
names[start:end:step] # step 默认值是1
print(names[0:-1:1]) # 设置步长为1
print(names[0:-1:2]) # 设置步长为2,这样会跳一个打印一个
print(names[0:-1:3]) # 设置步长为3
print(names[::3]) # 整个列表加步长3
代码输出如下:
在第2点倒着切的时候总有一个想法,为什么不能从右往左切呢,非要写出 [-5:-1] 这种很难让人看得明白的东西呢?在这里借助步长的设置我们可以实现从右往左切
names = ['Jove', '小猪佩奇', 'rain', 'eva', '张三', '李四','eva']
print(names[::-1]) # 会发现列表都倒序了
print(names[-1:-5:-1]) # 在倒序的基础上就可以从右往左切了
代码输出如下:
列表的排序和反转
一、排序
a = [83,4,2,4,6,19,33,21]
a.sort()
print(a)
代码输出如下:
上面的是数字很好理解,那如果列表中的是字符呢?
names = ['Jove', '小猪佩奇', 'rain','@', 'eva', '张三', '4','#','李四','eva']
names.sort()
print(names)
代码输出如下:
这个结果似乎出乎了我们的意料之外,那我们应该如何解释呢?答案全在下面这张表上,这张表是ASCII码表,而字符的排序优化级规则是按这张表来的
注意:使用 sort() 排序时列表中元素的变量类型需要是一致的,换句话说就是数字和字符串不能一起排序,这样会报错(Python3不可以,而Python2却可以)
二、反转
聪明的同学从上面提到步长从右往左切的时候其实就已经想到,其实步长为-1时列表就已经是反转的了,而列表当中还有专门的反转方法 reverse()
names = ['Jove', '小猪佩奇', 'rain','@', 'eva', '张三', '4','#','李四','eva']
names.reverse()
print(names)
代码输出如下:
可以看得出 reverse() 是直接把列表反转了并覆盖了原来的,当然使用步长来实现这一个效果只需要多加几步就可以了,看看这个实现代码
names = ['Jove', '小猪佩奇', 'rain','@', 'eva', '张三', '4','#','李四','eva']
names_reverse = names[::-1]
print(names_reverse)
names = names_reverse
print(names)
代码输出如下:
当然步长的作用还远远不止于此,它还可以让字符串反转,具体如何实现在后面细讲字符串时再来讲述
n = "Jove"
print(n[::-1])
代码输出如下:
列表的循环
for i in names: # i 是 for 循环中的变量,for 循环结束后 i 就会 del 掉,i 会取一个 names 中的值,若值在列表 names 中则为 True,最终会达到循环了整个列表
print(i)
代码输出如下: