玩转python列表

介绍

列表(list)是python的一种容器型数据类型。所谓容器型指的是列表可以将许多变量有序组织在一起,构成一个整体。列表可以存放任意数据类型的变量,包括列表本身。

python中的列表和C语言中的数组有相同的地方(存放数据,按索引访问),但是列表和数组是有本质区别的。列表可以存不同的数据类型。

a = ["hello", 123, [1,2,3], "world"]

列表的长度可以变化,即可以随时增加元素和删除元素。

a.append("haha")	# 列表尾部增加一个新元素
a.pop()				# 删除列表最后一个元素

定义列表

列表的定义非常简单,直接使用中括号将多个元素括起来,每个元素用逗号隔开。

# 方式一(推荐)
a = [1,2,3,4] 		# 用中括号内个元素用逗号隔开
b = []				# 空列表


# 方拾二(类型转换)
c = list([1,2,3,4,5])

d = list('abcde')
# d = ['a', 'b', 'c', 'd', 'e']

访问列表

通过索引值查看列表元素

# 列表中的元素是有序的,从左往右,第一个元素的索引下标是0,第二个元素下标是1,依次类推。
# 当索引值为负数,表示访问列表中倒数第几个元素,如a[-1]表示列表a中倒数第一个元素
>>> a = [5,3,1,7,2]
>>> a[2]
1
>>> a[-1]
2

通过索引值修改列表元素

>>> a = [5,3,1,7,2]
>>> a[2] = 10	# a = [5,3,10,7,2]

# 如果索引值超多列表长度,则报错
>>> a = [5,3,1,7,2]
>>> a[10] = 21		# 列表a没有索引10
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    a[10] = 21
IndexError: list assignment index out of range

删除列表或列表元素 del

# del 本质是解除变量对象和内存地址的绑定关系
l1 = [1,2,3,4]
del l1[1]
del l1

查看列表长度len()

>>> a = [5,3,1,7,2]
>>> len(a)
5

列表的加法和乘法 都是列表的扩展

>>> a = [1]
>>> b = [2]
>>> a+b
[1, 2]
>>> a*3
[1, 1, 1]

# 值得注意的是 使用 * 是浅拷贝
>>> a = [1, [11, 22]]
>>> b = a*3
>>> b
[1, [11, 22], 1, [11, 22], 1, [11, 22]]
>>> a[1][0] = 110
>>> b
[1, [110, 22], 1, [110, 22], 1, [110, 22]]

切片

通过索引,每次只能访问列表中的一个元素,如果需要同时获得列表中的多个元素可以通过切片的方式。

切片:从一个大的列表中copy出来一个子列表,原列表不变。

语法:a[start:end:step]

# 访问列表中下标0-2的元素
>>> a = [5,3,1,7,2]
>>> a[0:3]			# 切片时 顾头不顾尾(下标0可以访问,3访问不到,只访问到2)
[5, 3, 1]

# 访问列表前几个元素可以省略冒号前面的0
>>> a[:3]
[5, 3, 1]

# 访问列表中间元素
>>> a[1:4]
[3, 1, 7]

# 访问列表后几个元素
>>> a[1:]
[3, 1, 7, 2]

# 访问列表所有元素
>>> a[:]
[5, 3, 1, 7, 2]

# 只访问列表中奇数为元素
>>> a[::2]
[5, 1, 2]

# 逆序访问列表所有元素
>>> a[::-1]
[2, 7, 1, 3, 5]

# 访问列表倒数第一位元素 - 倒数第三位元素
>>> a[-3:]		# 顾头不顾尾, 如果a[-3:-1],则打印 [1, 7]
[1, 7, 2]

# 切片总结:a[start:end:step]
# start :起始位置下标
# end :终止位置下标
# step :步长,正数表示从左往右;负数表示从右往左
# 总体原则:顾头不顾尾

内置方法

常用内置方法

append() 尾部追加新元素

# 在列表尾部追加新元素
>>> a = ["hello", 123, [1,2,3], "world"]
>>> a.append("apple")
>>> a
['hello', 123, [1, 2, 3], 'world', 'apple']

insert(index, value) 任意位置添加新元素

# 在列表的 index 位置处插入新元素 value,原index处及后面的元素按顺序往后移一位。
>>> a = [5,3,1,7,2]
>>> a.insert(1, 5)		# 在下标1(即元素3)前插入元素5
>>> a
[5, 5, 3, 1, 7, 2]

# 当index为负数时,表示在倒数第index前插入元素
>>> a = [5,3,1,7,2]
>>> a.insert(-1, 10)
>>> a
[5, 3, 1, 7, 10, 2]

# 当index超过列表索引范围时,将在列表尾部或头部插入新元素
>>> a = [5,3,1,7,2]
>>> a.insert(110, 9)
>>> a.insert(-100, 9)
>>> a
[9, 5, 3, 1, 7, 2, 9]

pop(index=-1) 通过索引删除元素并返回元素,默认删除最后一个,元素不存在会报错

# 默认删除列表最后一个元素,并返回
>>> a = [5,3,1,7,2]
>>> a.pop()
2

# 指定删除列表index处位置的元素,并返回
>>> a = [5,3,1,7,2]
>>> a.pop(2)
1
>>> a.pop(-1)
2

# 列表为空或者index超过索引范围,则报错
>>> a = []
>>> a.pop()
Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    a.pop()
IndexError: pop from empty list

>>> b = [3,5]
>>> b.pop(5)
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    b.pop(5)
IndexError: pop index out of range

remove(value) 通过值删除元素,没有返回值,元素不存在会报错

# 删除列表中第一个出现的value,如果value不存在则报错。
# 必须明确指定要删除的元素。
>>> a = [5,3,1,7,2]
>>> a.remove(3)		# 删除元素3,此时 a = [5,1,7,1]
>>> a.remove(3)		# 不存在元素3,报错
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    a.remove(3)
ValueError: list.remove(x): x not in list

index(value, start=0, stop=9223372036854775807) 找元素索引,找不到会报错

# 返回列表中指定value第一次出现的index,value不在搜索范围内则报错。指定stop时,遵循“顾头不顾尾”原则。
>>> a = ["jack", "cindy", "joy", "cindy","mac"]
>>> a.index("cindy")
1
>>> a.index("cindy", 2)
3
>>> a.index("cindy", 2, 3)
Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    a.index("cindy", 2,3)
ValueError: 'cindy' is not in list

其他内置方法

count(value) 统计元素个数

# 返回value在列表中出现的次数,value不存在则返回0
>>> a = [5,3,1,3,7,2]
>>> a.count(3)
2

clear() 清空列表

# 清空列表
>>> a = [5,3,1,7,2]
>>> a.clear()
>>> a
[]

copy() 拷贝列表,浅拷贝

# 复制列表并返回
>>> a = [5,3,1,7,2]
>>> a.copy()
[5, 3, 1, 7, 2]

extend(iterable) 扩展列表,将一个可迭代对象的元素并入列表中

# 扩展列表,将可迭代对象的每个元素放在列表中,可迭代对象包括:字符串、列表、字典等
>>> a = [5,3,1,7,2]
# 1 扩展列表
>>> a.extend([1,1,1])
>>> a
[5, 3, 1, 7, 2, 1, 1, 1]

# 2 扩展字符串
>>> a.extend("abcd")
>>> a
[5, 3, 1, 7, 2, 1, 1, 1, 'a', 'b', 'c', 'd']

reverse() 列表反转,不是排序

# 将列表的元素反转,不会产生新列表
>>> a = [5,3,1,7,2]
>>> a.reverse()
>>> a
[2, 7, 1, 3, 5]

sort(key=None, reverse=False) 列表排序,默认升序,可定制排序方式

# 将列表元素排序,默认升序。
>>> a = [5,3,1,7,2]
>>> a.sort()	# a = [1, 2, 3, 5, 7]

# 参数key, 指定排序方式
>>> a = [(1,2),(3,5), (7,1)]
>>> a.sort(key=lambda x:x[1])	# 按元素第二个元素排序
>>> a
[(7, 1), (1, 2), (3, 5)]


# 参数reverse=True,降序排列
>>> a = [5,3,1,7,2]
>>>  a.sort(reverse=True)	# a = [7, 5, 3, 2, 1]

注意

列表内置方法会报错的有:pop()、remove()、index()。

  • 可以理解为列表操作具有保护机制,用户不可以随意删除列表中的元素。
  • 且索引是唯一的,当一个元素不存在于列表中,index只能做报错处理。
  • 切记:在遍历列表时删除列表元素,这样不稳妥

补充

切片修改元素

列表切片:本质是浅拷贝一份新的列表对象。

此外,列表切片还有一个不常用的功能:切片修改元素

#1 在列表位置1处插入新元素(1个或多个)
>>> l = [1,2,3,4]
>>> l[1:1] = [7]
>>> l
[1, 7, 2, 3, 4]
>>> l[1:1] = [8,8,8]
>>> l
[1, 8, 8, 8, 7, 2, 3, 4]

#2.1 修改列表元素
>>> l = [1,2,3,4]
>>> l[1:3] = [7]		# 列表位置1、位置2处的元素用数字7覆盖
>>> l
[1, 7, 4]

#2.2
>>> l = [1,2,3,4]
>>> l[1:3] = [7,7,7]	# 列表位置1、位置2处的元素用数字7、7、7覆盖
>>> l
[1, 7, 7, 7, 4]
posted @ 2020-02-25 17:46  the3times  阅读(358)  评论(0编辑  收藏  举报