列表

列表是Python中最基本也是最常用的数据结构之一。列表中的每个元素都被分配一个数字作为索引,用来表示该元素在列表内所排在的位置。第一个元素的索引是0,第二个索引是1,依此类推。

Python的列表是一个有序可重复的元素集合,可嵌套、迭代、修改、分片、追加、删除,成员判断。

从数据结构角度看,Python的列表是一个可变长度的顺序存储结构,每一个位置存放的都是对象的指针。

对于这个列表 alist = [1, “a”, [11,22], {“k1”:”v1”}],其在内存内的存储方式是这样的:

列表的索引反过来打印 列表的索引是从1开始的_数据结构


创建方式

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可

list = [] # 定义空列表
 list1 = [‘physics’, 1997, 2000]
 list2 = [1, 2, 3]
 list3 = [“a”, “b”, “c”]
访问列表内的元素
 列表从0开始为它的每一个元素顺序创建下标索引,直到总长度减一 。要访问它的某个元素,以方括号加下标值的方式即可。注意要确保索引不越界,一旦访问的 索引超过范围,会抛出异常。所以,一定要记得最后一个元素的索引是len(list)-1。lis = [“a”, “b”, “c”]
 lis[0]
 ‘a’lis[1]
 ‘b’lis[2]
 ‘c’lis[3]
 Traceback (most recent call last):
 File “<pyshell#7>”, line 1, in 
 lis[3]
 IndexError: list index out of range修改元素的值
 直接对元素进行重新赋值。lis[0]
 ‘a’lis[0] = “d”
 lis[0]
 ‘d’删除元素
 使用del语句或者remove(),pop()方法删除指定的元素。lis = [“a”, “b”, “c”]
 del lis[0] # 根据索引删除
 lis
 [‘b’, ‘c’]lis.remove(“b”) # 直接根据值进行删除
 lis
 [‘c’]lis.pop() # 弹出最后一个
 ‘c’lis
 []列表的特殊操作
 语句 结果 描述
 [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合两个列表
 [‘Hi!’] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 列表的乘法
 3 in [1, 2, 3] True 判断元素是否存在于列表中
 for x in [1, 2, 3]: print x, 1 2 3 迭代列表中的每个元素列表的常用函数
 函数 作用
 len(list) 返回列表元素个数,也就是获取列表长度
 max(list) 返回列表元素最大值
 min(list) 返回列表元素最小值
 list(seq) 将序列转换为列表s = list((1, “a”, “b”, 2))
 s
 [1, ‘a’, ‘b’, 2]max(s) # 不能混合不同类型进行最大最小求值
 Traceback (most recent call last):
 File “<pyshell#20>”, line 1, in 
 max(s)
 TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’排序和反转
 list.reverse() 将列表反转
 list.sort() 排序,默认升序
 如果列表内的元素全为数字,或者字母排序没有问题。
 如果字母和数字都有的情况下,排序会报错
 list.sort(reverse=True) 降序排列切片–也叫截取
 切片指的是对序列进行截取,选取序列中的某一段。
 切片的语法是: list[start:end]
 以冒号分割索引,start代表起点索引,end代表结束点索引。省略start表示以0开始,省略end表示到列表的结尾。注意,区间是左闭右开的!
 如果提供的是负整数下标,则从列表的最后开始往头部查找。例如-1表示最后一个元素,-3表示倒数第三个元素。
 切片过程中还可以设置步长,以第二个冒号分割,例如list[3:9:2],表示每隔多少距离取一个元素。
 a = [1,2,3,4,5,6,7,8]
 a[2:4] [3,4]
 a[:7] [1,2,3,4,5,6,7]
 a[2:] [3,4,5,6,7,8]
 s = a[:] 复制列表
 s
 [1,2,3,4,5,6,7,8]
 s.remove(2) 删除2元素 并不是根据下标进行删除的
 s = [1,3,4,5,6,7,8]a[-1] 8
 a[-5:] [4,5,6,7,8]
 a[::-1] 想当于逆序输出 [8, 7, 6, 5, 4, 3, 2, 1]
 a[1:5:2] [2,4]多维列表(嵌套列表)
 a = [[1,2,3],[4,5,6],[7,8,9]]
 a[0][1]
 2
 a = [[1,2,3],[4,5,6],{“k1”:“v1”}]
 a[2][“k1”]
 v1列表的遍历
 列表有好几种遍历方式:
 a = [1,2,3,4,5,6]
 for i in a: # 遍历每一个元素本身
 print(i)
 for i in range(len(a)): # 遍历列表的下标,通过下标取值
 print(i, a[i])
 x = 9
 if x in a: # 进行是否属于列表成员的判断。该运算速度非常快。
 print(“True”)
 else:
 print(“False”)列表的内置方法
 方法 作用
 append(obj) 在列表末尾添加新的对象
 count(obj) 统计某个元素在列表中出现的次数
 extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
 index(obj) 从列表中找出某个值第一个匹配项的索引位置
 insert(index, obj) 将对象插入列表
 pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
 remove(obj) 移除列表中某个值的第一个匹配项
 reverse() 反向列表中元素
 sort([func]) 对原列表进行排序
 copy() 复制列表
 clear() 清空列表,等于del lis[:]注意:其中的类似 append,insert, remove 等方法会修改列表本身,并且没有返回值
 练习
 test = [“a”, “b”, “c”, “d”]
 test.append(“A”)
 test
 [“a”, “b”, “c”, “d”,“A”]lis.append([‘a’])
 [‘a’, ‘b’, ‘c’, [‘a’]]test.count() 并不是求列表元素个数,而是求其中一个元素出现的次数
 Traceback (most recent call last):
 File “<pyshell#3>”, line 1, in 
 lis.count()
 TypeError: count() takes exactly one argument (0 given)
 test.count(“a”)
 1
 lis = [‘a’, ‘b’, ‘c’, [‘a’], [‘a’, ‘b’]]
 lis.count(‘a’) # 会出现几次?
 1
 lis.count([‘a’])
 1test.extend([“e”,“f”])
 test
 [“a”, “b”, “c”, “d”,“A”,“e”,“f”]append(object) 是将一个对象作为一个整体添加到列表中,添加后的列表比原列表多一个元素,该函数的参数可以是任何类型的对象,
 该函数没有返回值extend(iterable) 是将一个可迭代对象中的每个元素逐个地添加到列表中,可迭代对象中有几个元素,添加后的列表就比原列表多几个元素,
 该函数的参数必须是可迭代的对 象,改函数没有返回值test
 [“a”, “b”, “c”, “d”,“A”]test.index(“a”)
 0
 test.index(“A”)
 4test.insert(3,“C”)
 [“a”, “b”, “c”, “C”,“d”,“A”,“e”,“f”]test.pop()
 test
 [“a”, “b”, “c”, “C”,“d”,“A”,“e”]
 test.pop(4) # 根据位置弹出
 dtest.remove(3) 删除不是根据下标进行删除的,删除是根据键值来删除的
 Traceback (most recent call last):
 File “<pyshell#19>”, line 1, in 
 lis.remove(3)
 ValueError: test.remove(x): x not in list
 test.remove(“e”)test
 [“a”, “b”, “c”, “C”,A",“f”]
 test.reverse() 逆序输出
 [‘f’, ‘A’, ‘C’, ‘c’, ‘b’, ‘a’]
 newlist = test.copy()
 newlist
 [‘f’, ‘A’, ‘C’, ‘c’, ‘b’, ‘a’]
 newlist.clear() 清空列表
 newlist
 []
 test.sort()
 [‘A’, ‘C’, ‘a’, ‘b’, ‘c’, ‘f’] 按照ASCII字符表中数字排序的

注意:其中的类似 append,insert, remove 等方法会修改列表本身,并且没有返回值(严格的说是返回None)。