专题1 Python数据类型-List的操作

举报
北京小马哥 发表于 2019/05/13 20:53:25 2019/05/13
【摘要】 Python数据类型-List的操作

Python数据类型-List的操作

  • 目标: 掌握List数据结构的所有操作

  • 注: 不断迭代更新该日志

1.序列通用操作

序列: 包含List,Tuple,字符串类型 

索引 

切片 

加法 

乘法 

序列中是否包含某个元素 

序列长度 

序列内元素的最大最小值

2.创建List

#方式1 
ls1 = [1,2,3,4,5]

#方式2
ls2 = list((1,2,3,4,5,6)) 

#把其他数据类型转换为list类型
print(ls1)
print(ls2)

#查看类型
print(type(ls1))

#是否包含某一个元素
print(1 in ls1)
print(100 in ls1)

#加法
ls3 = ls1+['python','java','Go','scala','julia']
print(ls3)

#乘法
ls4 = ls1*2
print(ls4)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
<class 'list'>
TrueFalse
[1, 2, 3, 4, 5, 'python', 'java', 'Go', 'scala', 'julia']
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

3.访问List中的元素

  • 索引 (用于访问其中某单个元素)

  • 切片 (用于访问一定范围内元素)

#索引操作1 
students =['小白','小菜','青铜','老鸟','王者']

#索引在0开始
print(students[0])
print(students[1])
print(students[2])
print(students[3])
print(students[4])

#测试: 索引越界会出现什么情况
# print(students[5])

#知识点: 查看list的长度
print("students的长度: %s" % len(students))

#知识点: 查看list中元素的最大值与最小值

numbers = [1,100,-1,1.123]
print("numbers的最大值: %s" % max(numbers))
print("numbers的最小值: %s" % min(numbers))
小白
小菜
青铜
老鸟
王者
students的长度: 5
numbers的最大值: 100
numbers的最小值: -1
#索引操作2
students =['小白','小菜','青铜','老鸟','王者']

#负索引print(students)
print(students[-1])
print(students[-2])
print(students[-3])
print(students[-4])
print(students[-5])

#测试: 索引越界会出现什么情况
# print(students[5])
['小白', '小菜', '青铜', '老鸟', '王者']
王者
老鸟
青铜
小菜
小白
# 切片操作1
students =['小白','小菜','青铜','老鸟','王者']

#访问一定范围内的元素
print(students)
print(students[0:2])
print(students[0:4])
print(students[0:10])
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '小菜']
['小白', '小菜', '青铜', '老鸟']
['小白', '小菜', '青铜', '老鸟', '王者']
# 切片操作2 - 切片的缺省
students =['小白','小菜','青铜','老鸟','王者']

#访问一定范围内的元素
print(students)
print(students[0:])
print(students[:4])
print(students[:])
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '小菜', '青铜', '老鸟']
['小白', '小菜', '青铜', '老鸟', '王者']
# 切片操作3 - 切片的负边界
students =['小白','小菜','青铜','老鸟','王者']

#访问一定范围内的元素
print(students)
print(students[0:-1])
print(students[-5:-1])
print(students[-5:])
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '小菜', '青铜', '老鸟']
['小白', '小菜', '青铜', '老鸟']
['小白', '小菜', '青铜', '老鸟', '王者']
# 切片操作4 - 切片的步长
students =['小白','小菜','青铜','老鸟','王者']

#访问一定范围内的元素
print(students)
print(students[0:4:2])

#负步长: 就是由后往前访问,[m:n]  无论哪个方向m都要在n前面
print(students[0:4:-1])   

#这是由后往前访问,这个方向上,4在0的前面,所以[0:4:-1]为空
print(students[4:0:-1])
print(students[::-1])
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '青铜']
[]
['王者', '老鸟', '青铜', '小菜']
['王者', '老鸟', '青铜', '小菜', '小白']

4.操作list中的元素

  • 对元组进行增删改(查在上面)

# 添加元素
students =['小白','小菜','青铜','老鸟','王者']

# students[5]='xxx'
# print(students)

#添加元素: 只能通过list自带的内置函数来操作: append()
students.append('大师')
print(students)
# print(id(students))
# students = students+'大师'    

#错误方式
# print(students)students = students+['黄金','9段']  
  
#变相的实现添加元素
print(students)
# print(id(students))

#虽然实现了添加元素,但是发现这个list的id变化了,也就是创建了一个新的list
['小白', '小菜', '青铜', '老鸟', '王者', '大师']
2523064686152
['小白', '小菜', '青铜', '老鸟', '王者', '大师', '黄金', '9段']
2523065641544
# 删除元素
students =['小白','小菜','青铜','老鸟','王者']

del students[1]
print(students)
['小白', '青铜', '老鸟', '王者']
#修改: 某个元素的值

students =['小白','小菜','青铜','老鸟','王者']
print(students)

students[1] = '小学生'
print(students)
['小白', '小菜', '青铜', '老鸟', '王者']
['小白', '小学生', '青铜', '老鸟', '王者']
#修改: 某个范围元素的值
students =['小白','小菜','青铜','老鸟','王者']
print(id(students))
students[0:3]=['新手']*3
print(students)
print(id(students))

#注意: 如下操作还能改变了list的长度: 等于删除了一部分元素
students[0:3]=['高手']
print(students)
print(id(students))

#于是,进一步,是否可以通过这种切片赋值,删除元素呢?
students[0:2]=''print(students)   
#结果证明可行print(id(students))
2523066013128
['新手', '新手', '新手', '老鸟', '王者']
2523066013128
['高手', '老鸟', '王者']
2523066013128
['王者']
2523066013128

5.Python为list内置的方法

什么是方法? 方法是封装了一定功能的代码块

  • 1,append

  • 2,clear

  • 3,copy

  • 4,count

  • 5,extend

  • 6,index

  • 7,insert

  • 8,pop

  • 9,remove

  • 10,reverse

  • 11,sort

  • 12,高级排序

# 1, append
# 创建一个list数据结构,表示一个班级内的学员,并为其添加新学员
students = ['Jack Ma','Pony Ma','Elon Musk']
students.append('Jeff Dean')
students.append('Steve Jobs')
students.append('Mark Elliot Zuckerberg')
print(students)
['Jack Ma', 'Pony Ma', 'Elon Musk', 'Jeff Dean', 'Steve Jobs', 'Mark Elliot Zuckerberg']
# 2, clear
# 清空列表内的所有学员
students = ['Jack Ma','Pony Ma','Elon Musk']
students.append('Jeff Dean')
students.append('Steve Jobs')
students.append('Mark Elliot Zuckerberg')
print(students,'\n\n')
students.clear()
print(students)
['Jack Ma', 'Pony Ma', 'Elon Musk', 'Jeff Dean', 'Steve Jobs', 'Mark Elliot Zuckerberg'] 


[]
# 3, copy  
bat=['Baidu','Alibaba','Tencent']
print('bat: ',bat)
print('id(bat): ',id(bat),'\n')

# 看似复制的操作bat_plus = bat
print('bat_plus: ',bat_plus)
print('id(bat_plus): ',id(bat_plus),'\n') 

#发现虽然变量不同,但是变量指向的是同一个数据结构
# 真正的复制
bat_cpy = bat.copy()
print('bat_cpy: ',bat_cpy)
print('id(bat_cpy): ',id(bat_cpy),'\n')   
#创建了新的内存区域,保存原来的list
bat:  ['Baidu', 'Alibaba', 'Tencent']
id(bat):  2523074153160 
bat_plus:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_plus):  2523074153160 
bat_cpy:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_cpy):  2523061806216
# 3, copy 进一步观察复制结果
bat=['Baidu','Alibaba','Tencent']
print('bat: ',bat)
print('id(bat): ',id(bat),'\n')

# 看似复制的操作
bat_plus = bat
print('bat_plus: ',bat_plus)
print('id(bat_plus): ',id(bat_plus),'\n') 

#发现虽然变量不同,但是变量指向的是同一个数据结构# 真正的复制bat_cpy = bat.copy()
print('bat_cpy: ',bat_cpy)
print('id(bat_cpy): ',id(bat_cpy),'\n')  
 
#创建了新的内存区域,保存原来的list#前面的代码和上一节一样,下面改变bat里面的某个元素的值,再看结果
bat[0]='Huawei'
print('bat: ',bat)
print('id(bat): ',id(bat),'\n')
print('bat_plus: ',bat_plus)
print('id(bat_plus): ',id(bat_plus),'\n')
print('bat_cpy: ',bat_cpy)
print('id(bat_cpy): ',id(bat_cpy),'\n')
bat:  ['Baidu', 'Alibaba', 'Tencent']
id(bat):  2523074736968 
bat_plus:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_plus):  2523074736968 
bat_cpy:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_cpy):  2523076370888 
bat:  ['Huawei', 'Alibaba', 'Tencent']
id(bat):  2523074736968 
bat_plus:  ['Huawei', 'Alibaba', 'Tencent']
id(bat_plus):  2523074736968 
bat_cpy:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_cpy):  2523076370888
# 3, 另一种方式实现复制效果
bat=['Baidu','Alibaba','Tencent']
print('bat: ',bat)
print('id(bat): ',id(bat),'\n')
bat_copy = bat[:]
print('bat_copy: ',bat_copy)
print('id(bat_copy): ',id(bat_copy),'\n')

#改变一下原始list中的一个元素
bat[0]='Huawei'print('bat: ',bat)
print('id(bat): ',id(bat),'\n')  

#试验效果和copy是一样的print('bat_copy: ',bat_copy)
print('id(bat_copy): ',id(bat_copy))
bat:  ['Baidu', 'Alibaba', 'Tencent']
id(bat):  2523076896520 
bat_copy:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_copy):  2523074504712 
bat:  ['Huawei', 'Alibaba', 'Tencent']
id(bat):  2523076896520 
bat_copy:  ['Baidu', 'Alibaba', 'Tencent']
id(bat_copy):  2523074504712
# 4,count 作用: 计算指定元素在列表中出现了多少次
# list列表和set集合的不同在于,list允许有重复元素出现,set集合内部元素都是唯一的
# 例如: 计算一个句子中,某一关键字出现了多少次
sentence = 'He laughs best who laughs last'
times = sentence.count('laughs')
print(times)

#因为string字符串,list列表,tuple元组三个类型一样都属于序列,都具备count这个方法,使用方式一样
# 为了熟练list的用法
words = sentence.split(' ')

#后面string章节会介绍split,这是string的内置方法,返回一个list结果
print(type(words))  

#查看返回的结果类型: 是一个
listprint(words.count('laughs'))
#list的count方法,计算某个元素的出现次数
2
<class 'list'>
2
# 5,extend 与attend类似,目的是给list列表末尾添加元素,通过实例看区别
companys=['Baidu','Alibaba','Tencent']
tmd=['Toutiao','Meituan','Didi']
print('companys列表长度: ',len(companys))
print('\n')

# 需求,将tmd中的元素,追加到companys列表中去# 方式1,使用append,看效果companys.append(tmd)
print('append方式插入后companys列表长度: ',len(companys))
print(companys)  

#会发现,tmd做为一个元素插入进了companys列表,这不是我们想要的print('\n')

#方式2, 使用extend,看效果
companys_2=['Baidu','Alibaba','Tencent']   

#对标效果,创建一个新列表companys_2.extend(tmd)
print('extend方式插入后companys_2列表长度: ',len(companys_2))
print(companys_2)

# 所以extend方法的作用,是将整个集合内的元素拆开,再追加到原列表里面
companys列表长度:  3
append方式插入后companys列表长度:  4
['Baidu', 'Alibaba', 'Tencent', ['Toutiao', 'Meituan', 'Didi']]


extend方式插入后companys_2列表长度:  6
['Baidu', 'Alibaba', 'Tencent', 'Toutiao', 'Meituan', 'Didi']
# 5,extend 与 拼接的区别
companys_1=['Baidu','Alibaba','Tencent'] 
tmd=['Toutiao','Meituan','Didi']
print('companys_1 ID: ',id(companys_1))
companys_1.extend(tmd)
print('extend执行插入后...')
print('companys_1: ',companys_1)
print('companys_1 ID: ',id(companys_1),'\n')

companys_2=['Baidu','Alibaba','Tencent']
print('companys_2 ID: ',id(companys_2))
companys_2 = companys_2+tmd
print('拼接插入后...')
print('companys_2: ',companys_2)
print('companys_2 ID: ',id(companys_2))

# 结论: 拼接得到的是一个新的列表,而extend的操作是就地执行
companys_1 ID:  2523075808904
extend执行插入后...
companys_1:  ['Baidu', 'Alibaba', 'Tencent', 'Toutiao', 'Meituan', 'Didi']
companys_1 ID:  2523075808904 
companys_2 ID:  2523076059912
拼接插入后...
companys_2:  ['Baidu', 'Alibaba', 'Tencent', 'Toutiao', 'Meituan', 'Didi']
companys_2 ID:  2523070862152
# 5, 列用切片赋值 实现与extend同样的结果
companys_1=['Baidu','Alibaba','Tencent'] 
tmd=['Toutiao','Meituan','Didi']
print('companys_1 ID: ',id(companys_1))
companys_1[len(companys_1):]=tmd
print('切片执行插入后...')
print('companys_1: ',companys_1)
print('companys_1 ID: ',id(companys_1),'\n')
companys_1 ID:  2523075282120
切片执行插入后...
companys_1:  ['Baidu', 'Alibaba', 'Tencent', 'Toutiao', 'Meituan', 'Didi']
companys_1 ID:  2523075282120
# 6 index  作用: 在列表中查找一个元素第一次出现的索引
numbers=[10,20,30,40,50]*3
print(numbers)
print('元素20在numbers列表中第一次出现的索引位置: ',numbers.index(20))
print('元素20在numbers列表中第二次出现的索引位置: ',numbers.index(20,2))
print('元素20在numbers列表中第三次出现的索引位置: ',numbers.index(20,7))

#探索一下第二个参数的意义
[10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50]
元素20在numbers列表中第一次出现的索引位置:  1
元素20在numbers列表中第二次出现的索引位置:  6
元素20在numbers列表中第三次出现的索引位置:  11
# 7,insert   在list列表某个位置插入元素
# numbers=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   
#下面效果与该句相同numbers=list(range(0,10))   
#实践一下不同的参数: 给list函数传入的参数可以是一个range构造出来的排列,也可以是list或者tuple

print(numbers)
# 在某个位置插入一个元素numbers.insert(2,'zero')
print(numbers)

#探索,插入一个列表是什么效果? 是把列表作为一个元素插入进去,还是列表的元素展开各自作为一个元素呢?
# numbers.insert(0,[100,200,300])
# print(numbers)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 'zero', 2, 3, 4, 5, 6, 7, 8, 9]
[[100, 200, 300], 0, 1, 'zero', 2, 3, 4, 5, 6, 7, 8, 9]
# 8 pop   与append方法相反的功能,默认弹出末尾一个元素
numbers=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
print('Pop前: ',id(numbers))
numbers.pop()
print(numbers)
print('Pop后: ',id(numbers))
# 使用append/insert与pop配合就可以创建 "栈" 这种数据结构了
# 探索一下,是否可以弹出其它位置上的元素
# numbers.pop(2)
# print(numbers)
Pop前:  2523066247304[0, 1, 2, 3, 4, 5, 6, 7, 8]
Pop后:  2523066247304[0, 1, 3, 4, 5, 6, 7, 8]
# 9 remove   类似于查找index发现"第一个"符合条件的元素,这里是删除"第一个"符合条件的元素
names=['扎克伯格','小马哥','李彦宏','小马哥','张亚勤','李开复','小马哥','吴军']
names.remove('小马哥')
print(names)
['扎克伯格', '李彦宏', '小马哥', '张亚勤', '李开复', '小马哥', '吴军']
# 10,reverse 将列表倒序
numbers=[1,2,3,4,5,6]
print('倒排前: ',id(numbers))
numbers.reverse()
print(numbers)
print('倒排后: ',id(numbers),'\n')

#另一种方式实现
# numbers1 = [1,2,3,4,5,6]
# numbers2 = numbers1[::-1]
# print('倒排前: ',id(numbers1))
# numbers.reverse()
# print(numbers2)
# print('倒排后: ',id(numbers2))
倒排前:  2523075533192
[6, 5, 4, 3, 2, 1]
倒排后:  2523075533192 
倒排前:  2523077111624
[6, 5, 4, 3, 2, 1]
倒排后:  2523077111496
# 11,sort 排序
numbers=[88,18,25,100,-1,99]
print(id(numbers))
print(numbers)
print(id(numbers))   #试验证明: sort是就地操作
2523075495752
[88, 18, 25, 100, -1, 99]
2523075495752
# 测试copy之后的问题
numbers=[88,18,25,100,-1,99]
num = numbers.copy()
print(num)
numbers[1]=1000
print(numbers)
print(num)
print(sorted(num))
[88, 18, 25, 100, -1, 99]
[88, 1000, 25, 100, -1, 99]
None
None
#12 高级排序,为sort指定参数 key与reverse
# key: 就是为排序指定一个函数(自定义或者内置)
# reverse: 正序或者倒序整理排好序的列表
words=['Mark','Jack','Mark Elliot Zuckerberg','Pony Ma','Elon Musk']
words.sort(key=len)
print(words)
words.sort(key=len,reverse=True)
print(words)

#我就是盲探索一下,key以后可以用自定义的函数替代
# words=['Mark','Jack','Mark Elliot Zuckerberg','Pony Ma','Elon Musk']
# words.sort(key=min)
# print(words)
# words.sort(key=max)
# print(words)
['Mark', 'Jack', 'Pony Ma', 'Elon Musk', 'Mark Elliot Zuckerberg']
['Mark Elliot Zuckerberg', 'Elon Musk', 'Pony Ma', 'Mark', 'Jack']
['Mark Elliot Zuckerberg', 'Pony Ma', 'Elon Musk', 'Jack', 'Mark']
['Jack', 'Mark', 'Mark Elliot Zuckerberg', 'Elon Musk', 'Pony Ma']


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。