python容器类型——列表(list)
一、特点
-
列表是处理一组有序项目的数据结构
-
列表是python中最具灵活性的有序集合对象类型
-
列表可以包含任何类型的对象:字符串、数字甚至其他列表
-
列表是可变的数据类型,即这种类型的值是可以被修改的
二、定义
- 列表通过方括号中用逗号分割的项目
- 定义空列表
my_list = []
print(my_list)
#[]
my_list = [1, 2, 3, 4]
print(my_list)
# [1, 2, 3, 4]
print(my_list, type(my_list))
# [1, 2, 3, 4] <class 'list'>
- 列表可装入python的任何对象
my_list = [1, 'a', 1.1, None, [1,2], False]
print(my_list)
# [1, 'a', 1.1, None, [1, 2], False]
三、列表的基本操作
1、索引
通过下标访问列表中的元素,下标从0开始计数,可取出一个元素
- 正索引、负索引
print(mylist[3])
# None
print(mylist[-3])
# None
下标不能越界
超出索引值时会报IndexError错误
print(mylist[10])
IndexError Traceback (most recent call last)
Input In [20], in <cell line: 1>()
----> 1 print(mylist[10])
IndexError: list index out of range
2、切片
切片是通过下标访问列表中的元素,切片可以取出一个子列表
字符串的切片:split()函数,默认空格为分隔符,切片后放入列表中
mystr = "Hello Cali Today is Sunday"
mylist = mystr.split()
print(mylist, type(mylist))
# ['Hello', 'Cali', 'Today', 'is', 'Sunday'] <class 'list'>
切片包含开始,不包含结束,切片取值 => 没有下标越界问题
正负切片
- 正切片
i_list = [1,2,3,4]
my_list = ['apple','banana','orange',1,3.14,False,i_list]
print(my_list[0:3])
print(my_list[0:7:2])
print(my_list[2:])
print(my_list[:5])
print(my_list[:])
print(my_list[::])
#['apple', 'banana', 'orange']
#['apple', 'orange', 3.14, [1, 2, 3, 4]]
#['orange', 1, 3.14, False, [1, 2, 3, 4]]
#['apple', 'banana', 'orange', 1, 3.14]
#['apple', 'banana', 'orange', 1, 3.14, False, [1, 2, 3, 4]]
#['apple', 'banana', 'orange', 1, 3.14, False, [1, 2, 3, 4]]
- 负切片
i_list = [1,2,3,4]
my_list = ['apple','banana','orange',1,3.14,False,i_list]
print(my_list[-1:-4]) #默认步长为1,起始位置有误时,切出来会是空
print(my_list[-1:-4:-1])
print(my_list[-4:-1])
print(my_list[7:0:-1])
print(my_list[7:0:-2])
print(my_list[::-1])
# []
# [[1, 2, 3, 4], False, 3.14]
# [1, 3.14, False]
# [[1, 2, 3, 4], False, 3.14, 1, 'orange', 'banana']
# [[1, 2, 3, 4], 3.14, 'orange']
# [[1, 2, 3, 4], False, 3.14, 1, 'orange', 'banana', 'apple']
slice函数
slice函数的用途:生成一个slice对象,相当于可以给要切的内容取个名字。
my_list = ['apple','banana','orange',1,3.14,False,i_list]
print(my_list[0:3:1])
fruit = slice(0,3,1)
print(my_list[fruit])
#['apple', 'banana', 'orange']
#['apple', 'banana', 'orange']
练习
a = ['apple', 'orange', 123, 0.111, 'cali']
print(a[1:])
# ['orange', 123, 0.111, 'cali']
print(a[2:6]) # 切片可以越界
# [123, 0.111, 'cali']
print(a[1:-3])
# ['orange']
print(a[0],a[-1])
print(a[0::4])
# apple cali
#['apple', 'cali']
print(a[:])
# ['apple', 'orange', 123, 0.111, 'cali']
3、增加
append
- 在末尾,作为整体追加,类型不限
help(a.append)
Help on built-in function append:
append(object, /) method of builtins.list instance
Append object to the end of the list.
my_list = ['apple','banana','orange',1,3.14,False]
my_list2 = ['a','b','c']
print(my_list)
my_list.append('i am xiaowei')
print(my_list)
my_list.append(my_list2)
print(my_list)
#['apple', 'banana', 'orange', 1, 3.14, False]
#['apple', 'banana', 'orange', 1, 3.14, False, 'i am xiaowei']
#['apple', 'banana', 'orange', 1, 3.14, False, 'i am xiaowei', ['a', 'b', 'c']]
- 使用mylist.append()之后会自动把结果返回给mylist,不需要手动重新赋值
insert
- 在index位置插入数据, 2个参数(索引,插入的元素)
help(mylist.insert)
Help on built-in function insert:
insert(index, object, /) method of builtins.list instance
Insert object before index.
print(my_l
my_list = ['apple','banana','orange',1,3.14,False]
print(my_list)
my_list.insert(1,True)
print(my_list)
my_list.insert(1,'abc')
print(my_list)
#['apple', 'banana', 'orange', 1, 3.14, False]
#['apple', True, 'banana', 'orange', 1, 3.14, False]
#['apple', 'abc', True, 'banana', 'orange', 1, 3.14, False]
extend
-
扩展,将1个列表里的内容扩展到另外一个列表里去
-
只限可转为list的类型( str, list, tuple )
help(a.extend)
Help on built-in function extend:
extend(iterable, /) method of builtins.list instance
Extend list by appending elements from the iterable.
my_list = ['apple','banana','orange',1,3.14,False]
my_list2 = ['a','b','c']
my_str = 'abc'
my_list.extend(my_list2)
print(my_list)
my_list.extend(my_str)
print(my_list)
#['apple', 'banana', 'orange', 1, 3.14, False, 'a', 'b', 'c']
#['apple', 'banana', 'orange', 1, 3.14, False, 'a', 'b', 'c', 'a', 'b', 'c']
my_list.extend(82)
print(my_list)
# TypeError: 'int' object is not iterable
int 不是可迭代对象 =》迭代 -》依次从对象中取出元素
extend和+的区别
extend会对mylist做修改
+ 会产生一个新的列表 ,不会对mylist做修改
my_list = ['apple','banana','orange',1,3.14,False]
my_list2 = ['a','b','c']
#['apple', 'banana', 'orange', 1, 3.14, False, 'a', 'b', 'c']
使用‘+’时,只能连接两个相同类型的元素
my_list+"abc"
# TypeError: can only concatenate list (not "str") to list
4、删除
pop
-
删除元素,默认最后一个(指定index删除)
-
指定索引
-
使用pop函数后会返回删除掉的元素
help(list.pop)
Help on method_descriptor:
pop(self, index=-1, /)
Remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.
my_list = ['apple','banana','orange',1,3.14,False]
print(my_list)
t = my_list.pop()
print(t,my_list)
t = my_list.pop(2)
print(t,my_list)
#['apple', 'banana', 'orange', 1, 3.14, False]
#False ['apple', 'banana', 'orange', 1, 3.14]
#orange ['apple', 'banana', 1, 3.14]
remove
-
指定删除的数据
-
删除指定的元素(要删除的数据不存在时,会出错)
-
使用remove函数不会有返回值
help(list.remove)
Help on method_descriptor:
remove(self, value, /)
Remove first occurrence of value.
Raises ValueError if the value is not present.
my_list = ['apple','banana','orange',1,3.14,False]
my_list.remove('apple')
print(my_list)
my_list.remove('apple1')
print(my_list)
['banana', 'orange', 1, 3.14, False]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [53], in <cell line: 4>()
2 my_list.remove('apple')
3 print(my_list)
----> 4 my_list.remove('apple1')
5 print(my_list)
ValueError: list.remove(x): x not in list
del
-
根据下标删除
-
del是命令,不是内置函数
-
del是python的一个关键字,用于删除变量(的引用)
my_list = ['apple','banana','orange',1,3.14,False]
print(my_list)
del my_list[1]
print(my_list)
del my_list[1:2]
print(my_list)
del my_list[10]
print(my_list)
#['apple', 'banana', 'orange', 1, 3.14, False]
#['apple', 'orange', 1, 3.14, False]
#['apple', 1, 3.14, False]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Input In [58], in <cell line: 7>()
5 del my_list[1:2]
6 print(my_list)
----> 7 del my_list[10]
8 print(my_list)
IndexError: list assignment index out of range
del也可以直接删除列表
del my_list3
print(my_list3)
# NameError: name 'mylist3' is not defined
clear
- 清空列表
print(mylist3)
# ['weihong', 'liyili']
mylist3.clear()
print(mylist3)
# []
5、修改
修改元素主要是利用下标和切片来修改或增加、删除
1、直接利用下标修改元素
mylist = ['banana', 'orange', 1, 2, 3, 'apple', 'cali', 'leimingtao', 'xiaowei', 'b']
print(mylist)
# ['banana', 'orange', 1, 2, 3, 'apple', 'cali', 'leimingtao', 'xiaowei', 'b']
mylist[2] = "liu"
print(mylist)
# ['banana', 'orange', 'liu', 2, 3, 'apple', 'cali', 'leimingtao', 'xiaowei', 'b']
2、用切片修改列表中的元素
mylist[3:5] = ["shenjiemi", "xiejiaxing"]
print(mylist)
# ['banana', 'orange', 'liu', 'shenjiemi', 'xiejiaxing', 'apple', 'cali', 'leimingtao', 'xiaowei', 'b']
3、也可以使用切片增加列表中的元素
mylist[-1:] = ["lili", "xiaoqian", "xiaoming"]
print(mylist)
# ['banana', 'orange', 'liu', 'shenjiemi', 'xiejiaxing', 'apple', 'cali', 'leimingtao', 'xiaowei', 'lili', 'xiaoqian', 'xiaoming']
4、使用切片删除列表中的元素
mylist[0:5]=""
print(mylist)
# ['apple', 'cali', 'leimingtao', 'xiaowei', 'lili', 'xiaoqian', 'xiaoming']
mylist[0:5]=[]
print(mylist)
# ['xiaoqian', 'xiaoming']
5、print(mylist[1:1])
返回的值为空[],此时这个位置在第二个位置
使用切片方法时,字符串是可迭代对象、一个个取出来加进去
mylist[1:1]="abc" # 在第二个位置插入元素
print(mylist)
# ['xiaoqian', 'a', 'b', 'c', 'xiaoming']
mylist[1:1] = "abc" # 批量在指定位置增加数据
mylist[0:5] = "" # 批量指定下标的删除数据
print(mylist)
# ['b', 'c', 'xiaoming']
6、反转
reverse
mylist.reverse()
print(mylist)
# ['xiaoming', 'c', 'b']
切片方法
print(mylist[::-1])
# ['b', 'c', 'xiaoming']
7、排序
sort
列表中的元素必须是相同类型的才能排序、默认为升序
mylist = [3, 5, 18, -1, -3]
mylist.sort()
print(mylist)
# [-3, -1, 3, 5, 18]
排序之后使用reverse可以使结果反转,即降序排列
mylist = [3, 5, 18, -1, -3]
mylist.sort(reverse=True)
print(mylist)
mylist.sort(reverse=False)
print(mylist)
#[18, 5, 3, -1, -3]
#[-3, -1, 3, 5, 18]
mylist = ["apple", "orange", "banana"]
mylist.sort()
print(mylist)
# ['apple', 'banana', 'orange']
不同类型的元素排序会报错
mylist = ['a', 1, 2, 3]
mylist.sort()
# TypeError: '<' not supported between instances of 'int' and 'str'
8、统计
len
-
计算列表中元素的个数
-
不用输出,直接返回值
mylist = ['a', 1, 2, 3]
len(mylist)
# 4
count
- 计算某个元素在列表中出现的次数
- 会有返回值
my_list = ['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
print(my_list)
my_list.count('a')
#['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
#3
index
- 找出某个元素在列表中第一次出现的下标位置
- 会有返回值
my_list = ['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
#['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
my_list.index("a")
# 0
my_list.index("java")
# 7
9、练习
mylist1 = ['python','java','c']
mylist1.append('我是追加')
print(mylist1)
del mylist1[0::3]
print(mylist1)
print('cali' in mylist1)
print(len(mylist1))
mylist1.insert(1,['liu','cali',123,456])
print(mylist1)
#['python', 'java', 'c', '我是追加']
#['java', 'c']
#['java', ['liu', 'cali', 123, 456], 'c']
#False
#3
10、遍历列表
-
遍历:依次取出对象中的每一项数据
-
list是一个可迭代对象(iterable),可以直接用for遍历
print(mylist5)
# ['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
for item in mylist5:
print(item)
a
b
c
d
a
b
d
java
['liu', 'cali', 123, 456]
C
a
enumerate
-
枚举
-
enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值的时候可以使用
for item in enumerate(mylist5):
print(item)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'a')
(5, 'b')
(6, 'd')
(7, 'java')
(8, ['liu', 'cali', 123, 456])
(9, 'C')
(10, 'a')
11、判断成员关系
判断列表中是否有某个数据
print(mylist5)
# ['a', 'b', 'c', 'd', 'a', 'b', 'd', 'java', ['liu', 'cali', 123, 456], 'C', 'a']
print("Java" in mylist5)
# False
print("java" in mylist5)
# True
12、类型转换
1、list将字符串(str)转列表(list)
mystr = "abc"
print(list(mystr))
# ['a', 'b', 'c']
2、利用join函数将列表转字符串
mylist = ['a', 'b', 'c']
mystr = "".join(mylist)
print(mystr)
# abc
练习
nums = [2, 7, 11, 15]
target = 9
lens = len(nums)
j=-1
for i in range(lens):
if (target - nums[i]) in nums:
if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):#如果num2=num1,且nums中只出现了一次,说明找到是num1本身。
continue
else:
j = nums.index(target - nums[i],i+1) #index(x,i+1)是从num1后的序列后找num2
break
if j>0:
print([i,j])
else:
print([])
# [0, 1]