Python—列表(一个“打了激素”的数组)
我们在C语言中会使用数组来将一大堆数据类型一样的数据挨个摆在一起,但是数组有一个基本的要求,就是数据类型必须是一致的,我们知道Python的变量由于没有数据类型,也就是说Python没有数组这一概念,但是Python引入了更为强大的列表。
基本概念
列表(list)是Python中内置可变序列,是一个有序的元素集合;
列表中的每一个数据称为元素,列表的所有元素放在一对中括号“[”和“]”中,并使用逗号分隔开;
列表元素可以通过索引访问单个元素。
在Python中,同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、字典、集合、函数以及其他任意对象。
Python采用基于值的自动内存管理模式,变量并不直接存储值,而是存储值的引用或内存地址,这也是python中变量可以随时改变类型的重要原因。同理,Python列表中的元素也是值的引用,所以列表中各元素可以是不同类型的数据。
如果只有一对方括号而没有任何元素则表示空列表。
列表大小没有限制,可以随时修改。 列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证相邻元素之间没有缝隙。Python列表的这个内存自动管理功能可以大幅度减少程序员的负担,但插入和删除非尾部元素时涉及到列表中大量元素的移动,会严重影响效率。
访问列表中元素时采用索引形式 在非尾部位置插入和删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。 除非确实有必要,否则应尽量从列表尾部进行元素的追加与删除操作。
创建与删除
1.如同其他类型的Python对象变量一样,使用“=”直接将一个列表赋值给变量即可创建列表对象。例如:
1 a_list = ['a', 'b', 'mpilgrim', 'z', 'example'] 2 a_list = []
2.也可以使用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表。 例如:
1 list((3,5,7,9,11)) #将元组转换为列表 2 list(range(1, 10, 2)) #将range对象转换为列表 3 list('hello world') #将字符串转换为列表 4 list({3,7,5}) #将集合转换为列表 5 list({'a':3, 'b':9, 'c':78}) #将字典的“键”转换为列表 6 list({'a':3, 'b':9, 'c':78}.items())#将字典的“键:值”对转
3.当不再使用时,使用del命令删除整个列表,如果列表对象所指向的值不再有其他对象指向,Python将同时删除该值。 例如:
1 x = [1, 2, 3] 2 del x #删除列表对象 3 x #对象删除后无法再访问,抛出异常 4 NameError: name 'x' is not defined
列表推导式
1.列表推导式可以说是Python程序开发时应用最多的技术之一。
以方括号[ ]作为开始和结束的标记。
[expr for value in collection ifcondition]
列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
1 aList = [x*x for x in range(10)]
相当于
1 aList = [] 2 for x in range(10): 3 aList.append(x*x)
2.过滤不符合条件的元素
1 aList = [-1,-4,6,7.5,-2.3,9,-11] 2 [i for i in aList if i>0]
[6, 7.5, 9]
在列表推导式中使用多个循环,实现多序列元素的任意组合,并且可以结合条件语句过滤特定元素
1 [(x, y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
1 [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
列表操作
1.针对列表有一些基本操作,这些操作与字符串操作类似
2.列表常用方法
1)append()、insert()、extend() append()用于向列表尾部追加一个元素,insert()用于向列表任意指定位置插入一个元素,extend()用于将另一个列表中的所有元素追加至当前列表的尾部。这3个方法都属于原地操作,不影响列表对象在内存中的起始地址。
1 >>> x = [1, 2, 3] 2 >>> id(x) #查看对象的内存地址 3 50159368 4 >>> x.append(4) #在尾部追加元素 5 >>> x.insert(0, 0) #在指定位置插入元素 6 >>> x.extend([5, 6, 7]) #在尾部追加多个元素 7 >>> x 8 [0, 1, 2, 3, 4, 5, 6, 7] 9 >>> id(x) #列表在内存中的地址不变 10 50159368
2)pop()、remove()、clear() pop()用于删除并返回指定位置(默认最后一个)上的元素;remove()用于删除列表中第一个与指定值相等的元素;clear()用于清空列表中的所有元素。均属于原地操作。还可以使用del命令删除列表中指定位置的元素,同样属于原地操作。
1 >>> x = [1, 2, 3, 4, 5, 6, 7] 2 >>> x.pop() #弹出并返回尾部元素 3 >>> x.pop(0) #弹出并返回指定位置的元素 4 >>> x.clear() #删除所有元素 5 >>> x 6 [] 7 >>> x = [1, 2, 1, 1, 2] 8 >>> x.remove(2) #删除首个值为2的元素 9 >>> del x[3] #删除指定位置上的元素
3)count()、index() count()用于返回列表中指定元素出现的次数;index()用于返回指定元素在列表中首次出现的位置,如果该元素不在列表中则抛出异常。
1 >>> x = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] 2 >>> x.count(3) #元素3在列表x中的出现次数 3 3 4 >>> x.count(5) #不存在,返回0 5 0 6 >>> x.index(2) #元素2在列表x中首次出现的索引 7 1 8 >>> x.index(5) #列表x中没有5,抛出异常 9 ValueError: 5 is not in list
4)sort()、reverse()
sort()方法用于按照指定的规则对所有元素进行排序;reverse()方法用于将列表所有元素逆序或翻转。
>>> x = list(range(11)) #包含11个整数的列表 >>> import random >>> random.shuffle(x) #把列表x中的元素随机乱序 >>> x [6, 0, 1, 7, 4, 3, 2, 8, 5, 10, 9] >>> x.sort(key=lambda item:len(str(item)), reverse=True) #按转换成字符串以后的长度,降序排列 >>> x [10, 6, 0, 1, 7, 4, 3, 2, 8, 5, 9] >>> x.sort(key=str) #按转换为字符串后的大小,升序排序 >>> x.reverse() #翻转列表
序列操作常用内置函数
字符串拆分列表
对于字符串,可以通过split()函数,将字符串拆分成一个列表,默认以空格分割 例如: