目录
一、列表的创建
1.直接方括号创建
lst = list()
lst = [] #创建一个空列表
lst_1 = [0,1,2,3]
lst_2 = ['2','3','4',5]
print(type(lst),type(lst_1),type(lst_2))
#<class 'list'> <class 'list'> <class 'list'>
print(lst,lst_1,lst_2) #[] [0, 1, 2, 3] ['2', '3', '4', 5]
2.range()创建列表
range(start, stop[, step]) 左闭右开
输出对象为range
'''
range(start, stop[, step]) 左闭右开
'''
print(list(range(20)))
#指定输出终点为20(开区间)的整数列,默认起点为0
print(list(range(0,20)))
#指定输出从0-19的整数
print(list(range(3,20,2)))
#指定输出从3-19的整数,步长为2
print(list(range(20,3,-2)))
#指定由大到小输出从19-3的整数,步长为-2 (只有由大到小输出步长才能为负,负责输出空列表)
for i in range(0,20,2):
print(i)
3.list()转换列表
print(list('asjcbwfoef')) #将字符串对象转换为列表
print(list((1,2,3,4))) #将tuple元组对象转换为列表
print(list({3, 7, 5})) #将集合对象转换为列表
print(list(range(1,10,2))) # 将range对象转换为列表
print(list(map(str, range(10)))) # 将map对象转换为列表
print(list(zip('abcd', [1,2,3,4]))) # 将zip对象转换为列表
print(list(enumerate('Python'))) # 将enumerate对象转换为列表
print(list(filter(str.isdigit, 'a1b2c3d456'))) # 将filter对象转换为列表
4.列表推导式创建列表
data = [num for num in range(10) if num%2==0]
data1 = [(x,y) for x in range(5) for y in range(7)] #等价于二层循环的嵌套
print(data) #[0, 2, 4, 6, 8]
print(data1)
'''
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (1, 0), (1, 1), (1, 2),
(1, 3), (1, 4), (1, 5), (1, 6), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5),
(2, 6), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 0), (4, 1),
(4, 2), (4, 3), (4, 4), (4, 5), (4, 6)]
'''
#注意:
from random import random
data = [[random() for j in range(5)] for i in range(3)]
'''
也等价于二层的循环,但是先执行i in range(3),将前面的代码分成三份执行,
结果是二维列表,每个元素是包含5个数字的列表
'''
print(data)
'''
输出为:
[[0.8853994649551384, 0.5401974504702698, 0.2994441674569889,
0.9354233633069325, 0.32846604905082233], [0.29868955893760585,
0.4944817615807019, 0.04688261440071573, 0.9564456098602425,
0.4486649125807983], [0.9832352341323132, 0.9390120222567508,
0.018911101669808472, 0.9156486998542285, 0.95555817499617]]
'''
*注意:
于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的[1,2,3]
,也有3个指针和3个整数对象。
x = [a] * 4
操作中,只是创建4个指向list的引用,所以一旦a
改变,x
中4个a
也会随之改变。
二、列表的删除
del 删除对象
#del
lst = [1,2,3,4]
del lst
#接着打印 print(lst) 会报错
三、列表内添加元素
1.lst.insert()
#insert(inedx,x) 在列表中index位置的前面插入元素。无返回值
a = [1,2,3]
a.insert(0,0)
print(a) #[0, 1, 2, 3]
a.insert(4,4)
print(a) #[0, 1, 2, 3, 4]
2.lst.append()
#append(x) 将元素x追加到列表a的尾部,相当于拼接,无返回值
a = [1,2,3]
b = {4,5,6}
a.append(5)
print(a) #[1, 2, 3, 5]
print(a.append(6)) #输出None,
'''
不能这么用,个人理解是lst.append(x)相当于一种动作,并不会输出什么,
而是在原有a列表上做了改变
'''
a.append(b) #追加的元素也可以是列表、元组、集合之类的,但追加后是嵌套关系
print(a) #[1, 2, 3, 5, 6, {4, 5, 6}]
*注意:
如果括号追加的元素是一个列表或元组,append方法会将整个列表或元组作为一个整体追加到列表尾部
a = [1,2,3,4]
a.append([5,6,7,8])
print(a) #[1, 2, 3, 4, [5, 6, 7, 8]]
3.lst.extend()
'''
extend(L) 将列表/元组/集合/L中所有元素从后面追加到原列表中,
也可以追加字典L的key值到原列表中,无返回值
'''
a = [1,2,3]
l = [4,5,6]
a.extend(l) #拼接列表
a.extend(tuple(l)) #拼接元组
a.extend(set(l)) #拼接集合
print(a) #[1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6]
l_dict = {4:'hh',5:0,6:'?'}
a.extend(l_dict) #拼接字典的key值
print(a) #[1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
严格来说 append
是追加,把一个东西整体添加在列表后,而 extend
是扩展,把一个容器里的所有元素添加在列表后。
四、列表内删除元素
1.lst.remove()
#lst.remove(x) 根据值删除元素,删除值为x的元素,后面所有元素集体向前移,无返回值
a = [1,2,3,'hhh','QAQ',[1,'2']]
a.remove([1,'2']) #值可以是列表/元组/集合/字典等
a.remove('QAQ') #可以是字符串
a.remove(2) #可以是整数
print(a) #[1, 3, 'hhh']
2.lst.pop()
#pop(index) 根据下表删除元素,删除并返回列表中下标为index的值
a = [1,2,3,4,5]
print(a.pop()) #不加参数默认是删除返回最后一个元素,输出 5
print(a.pop(1)) #删除返回下标为1的元素,且后面元素集体向前移动,输出 2
print(a) #[1, 3, 4]
remove和pop都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引。而且remove是只删除,无返回值,而pop是删除后再返回此元素,如果要在删除元素后还能继续使用它,就使用方法pop()
3.del
del var1[,var2 ......] 删除单个或多个对象。如果知道要删除的元素在列表中的位置,可使用del
语句删除列表内元素
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del x[0:2]
print(x) # ['Wednesday', 'Thursday', 'Friday']
五、获取列表中的元素
1.下标获取元素
通过下标(索引值)访问元素,下标在左端从0开始,在右端从-1开始。从左往右是从0一直加1,从右往左是从-1一直减一。
- 通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。
- 通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。
data = list(range(1,20,1))
#range左闭右开,数字为1-19,下摆从前往后是0-18
print(data[0])
print(data[18])
#从后往前是(-1)-(-19)
print(data[-1])
print(data[-19])
'''
结果:
1
19
19
1
'''
2.切片操作
[start : stop : step]
获取部分元素
a = list(range(0,20))
print(a[:]) #获取所有元素
print(a[:3])
print(a[:])
print(a[0:20]) #从0到20,左闭右开,即0-19
print(a[4:7]) #4-6
print(a[10:20:2]) #10-19,2为步长
print(a[-3:]) #从倒数第三位到最后一位
print(a[-5:-1]) #从倒数第五位到最后一位
print(a[5:1:-1]) #"-1"为步长,即倒着从下标为5的切到下标为1的
'''
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[4, 5, 6]
[10, 12, 14, 16, 18]
[17, 18, 19]
[15, 16, 17, 18]
[5, 4, 3, 2]
'''
3.浅拷贝与深拷贝
[:] 复制列表中的所有元素
1).python赋值的详解
在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已,这两个变量指向的是同一片内存
lst = [1,2,3]
lst[1] = lst
print(lst)
'''
结果不是[1,[1,2,3],3],而是[1,[...],3]
'''
lst并不是[1,2,3]这个列表对象本身,而是指向它的标签。此条语句相当于创建了一个引用自身的结构,导致lst[1]指向lst本身,最终变成无限循环
所以要实现[1,[1,2,3],3],需要为lst[1]赋值为一个与原列表一样的新列表,才能达到修改原列表的目的且不发生循环引用的现象。这个新列表可以有python的浅拷贝获得
2).深拷贝用法
[:] 或 copy模块的deepcopy()
复制列表中的所有元素,也可以理解为列表从头到尾完整的切片,在不影响原列表的基础上返回与原列表一样的新列表
lst = [1,2,3]
print(lst[:]) #[1,2,3]
lst[1] = lst[:]
print(lst) #[1,[1,2,3],3]
lst_1 = lst
lst_2 = lst[:]
print(lst_1) #[1,2,3]
print(lst_2) #[1,2,3]
lst[0] = 0
print(lst) #[0,2,3]
print(lst_1) #[0,2,3]
print(lst_2) #[1,2,3] 表明浅拷贝的列表不受原列表改变而改变
六、列表常用操作符
- 等号操作符:
==
- 连接操作符
+
- 重复操作符
*
- 成员关系操作符
in
、not in
lst_1 = [1,2,3]
lst_2 = [4,5,6]
print(lst_1 + lst_2) #连接操作符 +
print(lst_1 * 3) #重复操作符 *
print(lst_1 == lst_2) #等号操作符:==
print(1 in lst_1) #成员关系操作符 in、not in
print(6 not in lst_2)
'''
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
False
True
False
'''
七、列表其用法
1.lst.count()
list.count(obj)
数量函数,统计某个元素在列表中出现的次数
a = [1,2,2,3,3,3]
print(a.count(2))
print(a.count(3))
print(a.count(4))
'''
2
3
0
'''
2.lst.index()
list.index(x[, start[, end]])
从列表中找出某个值第一个匹配项的索引位置,即获取下标
a = [1,2,3,4,6,2,6]
print(a.index(1))
print(a.index(2)) #当元素x在列表中出现多次时,返回最早出现时的下标
print(a.index(6))
print(a.index(6,3,7)) #3和7是切片,取下标为3-6的切片,返回第一个值为6的元素的原始下标
'''
0
1
4
4
'''
3.lst.sort()
list.sort(key=None, reverse=False)
排序函数,对原列表进行排序。
#sort() 按照指定规则对列表进行排序,与sorted()一样支持key参数和reverse参数
from random import shuffle,sample
a = list(range(0,20))
shuffle(a)
print(a)
a.sort() #默认正序排列
print(a)
print('===========')
b = sample(range(1000),10)
print(b)
b.sort(reverse = True) #加入 reverse 参数,表示反转,由正序变成倒序
b.sort(key = str) #转换成字符串后排序
print(b)
print('===========')
def Second(lst): #定义获取第二个元素的函数
return lst[1]
x = [(2, 2), (3, 4), (4, 1), (1, 3)]
x.sort(key=Second) #key值可以是自定义函数
print(x)
x.sort(key=lambda a: a[0]) #也可以是lambda匿名函数
print(x)
'''
[0, 15, 7, 14, 6, 16, 8, 19, 5, 12, 18, 10, 11, 13, 2, 4, 3, 9, 1, 17]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
===========
[370, 248, 82, 815, 179, 654, 35, 885, 966, 685]
[179, 248, 35, 370, 654, 685, 815, 82, 885, 966]
===========
[(4, 1), (2, 2), (1, 3), (3, 4)]
[(1, 3), (2, 2), (3, 4), (4, 1)]
'''
*sorted与lst.sort()方法对比
#sorted() 与 lst.sort() 对比
a = sample(range(100),10)
a_sorted = sorted(a) # sorted() 不能对a本身直接进行修改,但有返回值,
#需要打印返回值或者赋值
print(a_sorted)
a = sample(range(100),15)
a.sort() # sort() 是直接对a本身做了修改,没有返回值,
#不能通过 print(a.sort()) 打印
print(a)
'''
[9, 11, 13, 14, 15, 18, 30, 45, 60, 84]
[2, 17, 18, 21, 41, 47, 51, 52, 53, 59, 60, 69, 71, 95, 96]
'''
4.lst.reverse()
反转函数,反转列表中元素,注意不是倒序,是反转
from random import shuffle,sample
b = sample(range(100),10)
b.reverse() # reverse() 只是反转
print(b)
'''
[22, 40, 62, 20, 46, 77, 33, 68, 39, 90]
'''