【每天1分钟】PYTHON基础之数据类型-列表元素(操作)
上一篇,我们对PYTHON的列表操作进行了讲解,今天将开始讲列表的元素操作,可以通过【每天一分钟】PYTHON基础之数据类型-列表(操作)回顾列表操作的内容。
- 元素新增
- 可以使用“+”运算符将元素添加到列表中
>>> aList = [3, 4, 5]
>>> aList
[3, 4, 5]
>>> aList = aList + [6]
>>> aList
[3, 4, 5, 6]
严格意义上来讲,这并不是真的为列表添加元素,而是创建了一个新列表,并将原列表中的元素和新元素依次复制到新列表的内存空间。由于涉及大量元素的复制,该操作速度较慢,在涉及大量元素添加时不建议使用该方法。
- 使用列表对象的append()方法在当前列表尾部追加元素,原地修改列表,是真正意义上的在列表尾部添加元素,速度较快。
>>> aList = [3, 4, 5]
>>> aList
[3, 4, 5]
>>> aList.append(6)
>>> aList
[3, 4, 5, 6]
- 使用列表对象的extend()方法可以将另一个迭代对象的所有元素添加至该列表对象尾部。
>>> aList = [3, 4, 5]
>>> aList
[3, 4, 5]
>>> bList = ['a', 'b', 'c']
>>> bList
['a', 'b', 'c']
>>> aList.append(bList)
>>> aList
[3, 4, 5, ['a', 'b', 'c']] #bList列表作为一个元素添加进了aList
>>> aList.extend(bList)
>>> aList
[3, 4, 5, ['a', 'b', 'c'], 'a', 'b', 'c'] #bList各元素添加进了aList
- 使用列表对象的insert()方法将元素添加至列表的指定位置。
>>> aList = [1, 2, 3, 4, 5]
>>> aList.insert(3, 6) #在aList下标为3的位置添加元素6
>>> aList
[1, 2, 3, 6, 4, 5]
应尽量从列表尾部进行元素的增加与删除操作。
列表的insert()可以在列表的任意位置插入元素,但由于列表的自动内存管理功能,insert()方法会引起插入位置之后所有元素的移动,这会影响处理速度。
- 使用乘法来扩展列表对象,将列表与整数相乘,生成一个新列表,新列表是原列表中元素的重复。
>>> aList = [1, 2, 3]
>>> aList = aList * 3
>>> aList
[1, 2, 3, 1, 2, 3, 1, 2, 3]
当使用*运算符将包含列表的列表重复并创建新列表时,并不是复制子列表值,而是复制已有元素的引用。因此,当修改其中一个值时,相应的引用也会被修改。
- 元素删除
- 使用del命令删除列表中的指定位置上的元素。
>>> a_list = [3,5,7,9,11]
>>> del a_list[1]
>>> a_list
[3, 7, 9, 11]
- 使用列表的pop()方法删除并返回指定位置(默认为最后一个)上的元素,如果给定的索引超出了列表的范围则抛出异常。
>>> aList = [1, 3, 5]
>>> aList.pop()
5
>>> aList
[1, 3]
>>> aList.pop(1)
3
>>> aList
[1]
>>> aList.pop()
1
>>> aList
[]
>>> aList.pop() #列表元素已空,抛出异常
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
aList.pop()
IndexError: pop from empty list
- 使用列表对象的remove()方法删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出异常。
>>> a_list = [3,5,7,9,7,11]
>>> a_list.remove(7)
>>> a_list
[3, 5, 9, 7, 11]
代码编写好后必须要经过反复测试,不能满足于几次测试结果正确。例如,下面的代码成功地删除了列表中的重复元素,执行结果是完全正确的。
>>> x = [1,2,1,2,1,2,1,2,1]
>>> for i in x:
if i == 1:
x.remove(i)
>>> x
[2, 2, 2, 2]
然而,上面这段代码的逻辑是错误的。同样的代码,仅仅是所处理的数据发生了一点变化,然而当循环结束后却发现并没有把所有的“1”都删除,只是删除了一部分。
>>> x = [1,2,1,2,1,1,1]
>>> for i in x:
if i == 1:
x.remove(i)
>>> x
[2, 2, 1]
两组数据的本质区别在于,第一组数据中没有连续的“1”,而第二组数据中存在连续的“1”。出现这个问题的原因是列表的自动内存管理功能。
在删除列表元素时,Python会自动对列表内存进行收缩并移动列表元素以保证所有元素之间没有空隙,增加列表元素时也会自动扩展内存并对元素进行移动以保证元素之间没有空隙。每当插入或删除一个元素之后,该元素位置后面所有元素的索引就都改变了。
正确的代码:
>>> x = [1,2,1,2,1,1,1]
>>> for i in x[::]: #切片
if i == 1:
x.remove(i)
或者:
>>> x = [1,2,1,2,1,1,1]
>>> for i in range(len(x)-1,-1,-1): #从后往前删
if x[i]==1:
del x[i]
- 使用列表对象的clear()方法删除所有元素,但保留列表对象。
>>> aList = [1, 2, 3]
>>> aList.clear()
>>> aList
[]
>>> aList.clear()
>>> aList
[]
- 元素修改
>>> aList = [1, 2, 3]
>>> aList[1] = 10
>>> aList
[1, 10, 3]
>>> aList[100] = 100
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
aList[100] = 100
IndexError: list assignment index out of range
- 元素查询与计数
- 使用下标直接访问列表元素,如果指定下标不存在,则抛出异常。
>>>aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[3]
6
>>> aList[15]
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
aList[15]
IndexError: list index out of range
- 使用列表对象的index()方法获取指定元素首次出现的下标,若列表对象中不存在指定元素,则抛出异常。
>>>aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList.index(7)
4
>>> aList.index(100)
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
aList.index(100)
ValueError: 100 is not in list
- 使用列表对象的count()方法统计指定元素在列表对象中出现的次数。
>>> aList = [3, 4, 5, 6, 7, 9, 11, 11, 13, 15, 17]
>>> aList
[3, 4, 5, 6, 7, 9, 11, 11, 13, 15, 17]
>>> aList.count(7)
1
>>> aList.count(0)
0
>>> aList.count(11)
2
- 成员资格
使用in关键字来判断一个值是否存在于列表中,返回结果为“True”或“False”。
>>> aList
[3, 4, 5, 5.5, 7, 9, 11, 13, 15, 17]
>>> 3 in aList
True
>>> 18 in aList
False
>>> bList = [[1], [2], [3]]
>>> 3 in bList
False
>>> 3 not in bList
True
>>> [3] in bList
True
>>> aList = [3, 5, 7, 9, 11]
>>> bList = ['a', 'b', 'c', 'd']
>>> (3, 'a') in zip(aList, bList)
True
>>> for a, b in zip(aList, bList):
print(a, b)