前一课主要是写的一些自己学习的列表、元组的一些公共的方法。现在这节课我们来学习列表的使用。
元组支持的操作,列表基本上都支持;列表支持对元素的修改,而元组则不支持。如果程序不需要修改列表所包含的元素,那么使用元组。
创建列表
内置的list()函数来创建列表, list()函数可用于将元组、区间(range)等对象转
换为列表。
例如:
a_tuple = ('crazyit', 20, -1.2) # 将元组转换成列表 a_list = list(a_tuple) print(a_list) # 使用range()函数创建区间(range)对象 a_range = range(1, 5) print(a_range) # range(1, 5) # 将区间转换成列表 b_list = list(a_range) print(b_list) # [1, 2, 3, 4] # 创建区间时还指定步长 c_list = list(range(4, 20, 3)) print(c_list) # [4, 7, 10, 13, 16, 19]Python2.x提供了一个xrange()函数和3.x的range()函数基本相同。2.x提供了range()函数,但是返回的是列表对象。
Python 也提供了一个tuple()函数, 该函数可用于将列表、区间(range)等对象转换为元组
a_list = ['crazyit', 20, -1.2] # 将列表转换成元组 a_tuple = tuple(a_list) print(a_tuple) # 使用range()函数创建区间(range)对象 a_range = range(1, 5) print(a_range) # range(1, 5) # 将区间转换成元组 b_tuple = tuple(a_range) print(b_tuple) # (1, 2, 3, 4) # 创建区间时还指定步长 c_tuple = tuple(range(4, 20, 3)) print(c_tuple) # (4, 7, 10, 13, 16, 19)增加列表元素
列表的append()方法:
参数追加到列表的最后面,append ()方法既可接收单个值,也可接收元组、列
表,该方法只是把元组、列表当成单个元素, 这样就会形成在列表中嵌套列表、
嵌套元组的情形。
例如:
a_list = ['crazyit', 20, -2] # 追加元素 a_list.append('fkit') print(a_list) # ['crazyit', 20, -2, 'fkit'] a_tuple = (3.4, 5.6) # 追加元组,元组被当成一个元素 a_list.append(a_tuple) print(a_list) # ['crazyit', 20, -2, 'fkit', (3.4, 5.6)] # 追加列表,列表被当成一个元素 a_list.append(['a', 'b']) print(a_list) # ['crazyit', 20, -2, 'fkit', (3.4, 5.6), ['a', 'b']]列表的extend()方法:
追加列表中的元素,追加的内容不被当成一个整体。
例如:
b_list = ['a', 30] # 追加元组中的所有元素 b_list.extend((-2, 3.1)) print(b_list) # ['a', 30, -2, 3.1] # 追加列表中的所有元素 b_list.extend(['C', 'R', 'A']) print(b_list) # ['a', 30, -2, 3.1, 'C', 'R', 'A'] # 追加区间中的所有元素 b_list.extend(range(97, 100)) print(b_list) # ['a', 30, -2, 3.1, 'C', 'R', 'A', 97, 98, 99]insert()方法:
指定将元素插入列表的具体位置
例如:
c_list = list(range(1, 6)) print(c_list) # [1, 2, 3, 4, 5] # 在索引3处插入字符串 c_list.insert(3, 'CRAZY' ) print(c_list) # [1, 2, 3, 'CRAZY', 4, 5] # 在索引3处插入元组,元组被当成一个元素 c_list.insert(3, tuple('crazy')) print(c_list) # [1, 2, 3, ('c', 'r', 'a', 'z', 'y'), 'CRAZY', 4, 5]删除列表元素
删除列表元素使用del语句, 可用于删除列表的元素,也可用于删除变量等。
使用del语句既可删除列表中的单个元素,也可直接删除列表的中间一段。
例如:
a_list = ['crazyit', 20, -2.4, (3, 4), 'fkit'] # 删除第3个元素 del a_list[2] print(a_list) # ['crazyit', 20, (3, 4), 'fkit'] # 删除第2个到第4个(不包含)元素 del a_list[1: 3] print(a_list) # ['crazyit', 'fkit'] b_list = list(range(1, 10)) # 删除第3个到倒数第2个(不包含)元素,间隔为2 del b_list[2: -2: 2] print(b_list) # [1, 2, 4, 6, 8, 9] # 删除第3个到第5个(不包含)元素,间隔为2 del b_list[2: 4] print(b_list) # [1, 2, 8, 9] name = 'crazyit' print(name) # crazyit # 删除name变量 del name #print(name) # NameErrorremove()方法来删除列表元素,
该方法并不是根据索引来删除元素的,而是根据元素本身来执行删除操作的。
该方法只删除第一个找到的元素,如果找不到该元素,该方法将会引发ValueError 错 误。
例如:
c_list = [20, 'crazyit', 30, -4, 'crazyit', 3.4] # 删除第一次找到的30 c_list.remove(30) print(c_list) # [20, 'crazyit', -4, 'crazyit', 3.4] # 删除第一次找到的'crazyit' c_list.remove('crazyit') print(c_list) # [20, -4, 'crazyit', 3.4]clear()方法,该方法用于清空列表的所有元素。
例如:
c_list.clear() print(c_list) # []修改列表元素
通过索引对列表元素赋值,可使用正数索引,也可使用负数索引。
程序也可通过slice语法对列表其中一部分赋值,在执行这个操作时并不要求新赋值的
元素个数与原来的元素个数相等。
例如:
a_list = [2, 4, -3.4, 'crazyit', 23] # 对第3个元素赋值 a_list[2] = 'fkit' print(a_list) # [2, 4, 'fkit', 'crazyit', 23] # 对倒数第2个元素赋值 a_list[-2] = 9527 print(a_list) # [2, 4, 'fkit', 9527, 23] b_list = list(range(1, 5)) print(b_list) # 将第2个到第4个(不包含)元素赋值为新列表的元素 b_list[1: 3] = ['a', 'b'] print(b_list) # [1, 'a', 'b', 4]对列表中空的slice赋值,就变成了为列表插入元素。
例如:
# 将第3个到第3个(不包含)元素赋值为新列表的元素,就是插入 b_list[2: 2] = ['x', 'y'] print(b_list) # [1, 'a', 'x', 'y', 'b', 4]将列表其中一段赋值为空列表,就变成了从列表中删除元素。
例如:
# 将第3个到第6个(不包含)元素赋值为空列表,就是删除 b_list[2: 5] = [] print(b_list) # [1, 'a', 4]对列表使用slice语法赋值时,不能使用单个值;如果使用字符串赋值,Python会自动把字符串当成序列处理,其中每个字符都是一个元素。
例如:
# Python会自动将str分解成序列 b_list[1: 3] = 'Charlie' print(b_list) # [1, 'C', 'h', 'a', 'r', 'l', 'i', 'e']指定step参数。但如果指定了step参数,则要求所赋值的列表元素个数与所替换的列表元素个数相等
例如:
c_list = list(range(1, 10)) # 指定step为2,被赋值的元素有4个,因此用于赋值的列表也必须有4个元素 c_list[2: 9: 2] = ['a', 'b', 'c', 'd'] print(c_list) # [1, 2, 'a', 4, 'b', 6, 'c', 8, 'd']列表的其他常用方法
在交互式解释器中输入dir(list)即可看到列表包含的所有方法:
>>>dir(list)
[append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
常用方法如下:
count():用于统计列表中某个元素出现的次数。
index():用于判断某个元素在列表中出现的位置。
pop():用于将列表当成“栈”使用, 实现元素出栈功能。可实现先入后出(FILO)
reverse():用于将列表中的元素反向存放。
sort() 用于对列表元素排序。
count()例如:
a_list = [2, 30, 'a', [5, 30], 30] # 计算列表中30的出现次数 print(a_list.count(30)) # 2 # 计算列表中[5, 30]的出现次数 print(a_list.count([5, 30])) # 1index()例如:
a_list = [2, 30, 'a', 'b', 'crazyit', 30] # 定位元素30的出现位置 print(a_list.index(30)) # 1 # 从索引2处开始、定位元素30的出现位置 print(a_list.index(30, 2)) # 5 # 从索引2处到索引4处之间定位元素30的出现位置,找不到该元素 print(a_list.index(30, 2, 4)) # ValueErrorpop()例如:
stack = [] # 向栈中“入栈”3个元素 stack.append("fkit") stack.append("crazyit") stack.append("Charlie") print(stack) # ['fkit', 'crazyit', 'Charlie'] # 第一次出栈:最后入栈的元素被移出栈 print(stack.pop()) print(stack) # ['fkit', 'crazyit'] # 再次出栈 print(stack.pop()) print(stack) # ['fkit'](push()方法在其他语言中实现入栈操作,但Python并没有,我们可以使用append()方法来代替push()方法实现入栈操作)。所有语言类似,出栈操作既会移出列表的最后一个元素,也会返回被移出的元素。
reverse()例如:
a_list = list(range(1, 8)) # 将a_list列表元素反转 a_list.reverse() print(a_list) # [7, 6, 5, 4, 3, 2, 1]sort()对列表元素进行排序
a_list = [3, 4, -2, -30, 14, 9.3, 3.4] # 对列表元素排序 a_list.sort() print(a_list) #[-30, -2, 3, 3.4, 4, 9.3, 14] b_list = ['Python', 'Swift', 'Ruby', 'Go', 'Kotlin', 'Erlang'] # 对列表元素排序:默认按字符串包含的字符的编码大小比较 b_list.sort() print(b_list) # ['Erlang', 'Go', 'Kotlin', 'Python', 'Ruby', 'Swift']还可以传入两个参数:
key参数:为每个元素都生成一个比较大小的“键”;
reverse参数:执行是否需要反转排序——默认是从小到大排序;True:从大到小
# 指定key为len,指定使用len函数对集合元素生成比较的键, # 也就是按字符串的长度比较大小 b_list.sort(key=len) print(b_list) # ['Go', 'Ruby', 'Swift', 'Erlang', 'Kotlin', 'Python'] # 指定反向排序 b_list.sort(key=len, reverse=True) print(b_list) # ['Erlang', 'Kotlin', 'Python', 'Swift', 'Ruby', 'Go']在Python 2.x中,列表的sort()方法中可传入一个比较大小的函数,该函数负责比较列表元素的大小。该函数包含两个参数,返回正数,参数1>参数2,返回负数,参数1< 参数2,返回0,参数相等。
# 以下代码只能在Python 2.x中执行 # 定义一个根据长度比较大小的比较函数 def len_cmp(x, y): # 下面代码比较大小的逻辑是:长度大的字符串就算更大 return 1 if len(x) > len(y) else (-1 if len(x) < len(y) else 0) b_list.sort(len_cmp) print(b_list) #['Go', 'Ruby', 'Swift', 'Erlang', 'Kotlin', 'Python']