Python数据结构:列表(list)


列表(list)

列表由用方括号括起并由逗号分隔的多个表达式构成,创建后可以对其中的元素进行添加、删除、修改等操作,可以使用索引和切片功能对列表中的元素进行查询。

列表的定义

列表是可变的序列:

  • 可变说明可以对列表中的元素进行增、删、改的操作
  • 序列说明列表中的元素有顺序位置,可以通过元素的索引位置获取该元素

列表的创建

1.使用中括号[]创建列表,示例如下:

>>> list01 = [123, 'abc', ['ddd', 645], None, {
    
    }, ()]
>>> print(list01) # 列表中的元素可以是任意 Python对象
[123, 'abc', ['ddd', 645], None, {
    
    }, ()]

2.使用list()函数将其他序列转换为列表,示例如下:

>>> str01 = 'python'
>>> list01 = list(str01) # list()函数将字符串转换为列表
>>> print(list01)
['p', 'y', 't', 'h', 'o', 'n']

>>> tuple01 = ('p', 'y', 't', 'h', 'o', 'n')
>>> list01 = list(tuple01) # # list()函数将元组转换为列表
>>> print(list01)
['p', 'y', 't', 'h', 'o', 'n']

3.使用range()函数创建列表:

range()函数的语法如下:

range(start, stop[, step])

参数:

  • start: 计数从 start 开始。默认是从0开始。例如range(5)等价于range(0, 5)
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
>>> print(range(0, 5))
range(0, 5) 

range()函数返回的是一个可迭代对象(类型是对象),可以使用lis()函数将生成的数列转换为列表,示例代码如下:

>>> list01 = list(range(0, 5))
>>> print(list01)
[0, 1, 2, 3, 4]

可以创建空列表后使用for循环对range()函数生成的可迭代对象进行循环遍历,将元素依次追加到创建好的空列表中,示例代码如下:

>>> list01 = []
>>> for i in range(0, 5):
...		lisl01.append(i)
>>> print(list01)
[0, 1, 2, 3, 4]

4.使用解析结构创建列表,示例代码如下:

>>> list01 = [x for x in range(5)]
>>> print(list01)
[0, 1, 2, 3, 4]

列表元素获取

与字符串类似,列表是一个序列,可以使用索引和切片获取其中的元素,索引获取元素示例代码如下:

>>> list01 = ['p', 'y', 't', 'h', 'o', 'n']
>>> print(list01[1]) # 从左到右,获取第1个元素
y
>>> print(list01[-2]) # 从右到左,获取倒数第2个元素
o

切片获取元素示例代码如下:

>>> list01 = ['p', 'y', 't', 'h', 'o', 'n']
>>> print(list01[0:3])
['p', 'y', 't']

使用切片后返回值是一个新列表,可以使用id()函数或者身份运算符进行测试,示例代码如下:

>>> list01 = ['p', 'y', 't', 'h', 'o', 'n']
>>> print(id(list01))
>>> print(id(list01[:])) # 两者引用对象的位置不同
1582124578048
1582124815296

注意:切片会生成一个新的对象,只有一种情况除外:字符串完全切片不会生成新对象,示例代码如下:

>>> str01 = 'python'
>>> print(id(str01))
>>> print(id(str01[:])) # 返回的id相同,切片和str01引用了同一个对象,由内存节约机制所决定
1909940203120
1909940203120

列表添加元素

1.添加单个元素

append() 方法在列表末尾添加一个元素,语法如下:

list.append(obj)

参数:

  • obj – 添加到列表末尾的对象

示例如下:

>>> list01 = ['a','b','c']
>>> list01.append('d')
>>> print(list01)
['a', 'b', 'c', 'd']

2.插入元素

insert()方法用于在指定的位置插入元素,语法如下:

list.insert(index, obj)

参数:

  • index – 对象obj需要插入的索引位置。
  • obj – 要插入列表中的对象。

示例如下:

>>> list01 = ['ali', 'Taobao']
>>> list01.insert(1, 'Baidu')
>>> print(list01)
['ali', 'Baidu', 'Taobao']

3.添加多个元素

extend()方法用于在列表末尾添加多个元素,参数为序列,语法如下:

list.extend(seq)

参数:

  • seq – 元素列表,可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。

示例代码如下:

>>> list01 = [1,2,3,4]
>>> list02 = [5,6,7]
>>> list01.extend(list02)
>>> print(list01)
[1, 2, 3, 4, 5, 6, 7]

列表删除元素

1.按值删除

remove()方法用于删除列表中的指定元素,如果有重复值,只能删除第一个,无返回值,语法如下:

list.remove(obj)

参数:

  • obj – 列表中要移除的对象。

示例代码如下:

>>> list01 = ['a','b','c','b']
>>> list01.remove('b') # 只能删除第一个'b'元素
>>> print(list01)
['a', 'c', 'b']

使用remove删除列表中不存在的元素时会报错,示例代码如下:

>>> list01 = ['a','b','c','b']
>>> list01.remove('d') # 删除列表中不存在的元素时会报错
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    list01.remove('d')
ValueError: list.remove(x): x not in list

2.按位置删除

pop()方法用于删除指定位置的对象,省略位置时会删除最后一个对象,同时返回被删除的对象,语法如下:

list.pop([index=-1])

参数:

  • index – 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。

示例代码如下:

>>> list01 = ['a','b','c','b']
>>> print(list01.pop(1)) # 返回被删除的对象
b

3.del语句删除

用del语句删除列表中指定数据或者切片,无返回值,语法如下:

del list[index]

参数:

  • index – 索引。

示例代码如下:

>>> list01 = ['a','b','c','b']
>>> del list01[2] # del语句删除指定位置的对象
>>> print(list01)
['a', 'b', 'b']

>>> list01 = ['a','b','c','b']
>>> del list01[0:2] # del语句删除切片内的对象
>>> print(list01)
['c', 'b']

4.清空列表

clear()方法清空列表中的全部数据,语法如下:

list.clear()

参数:

示例代码如下:

>>> list01 = ['a','b','c','b']
>>> list01.clear()
>>> print(list01)
[]

列表修改元素

列表是一个可变的序列,列表创建完成后可以对其中的元素进行修改,语法如下:

list[index] = 'obj'

参数:

  • index --索引。
  • obj – 修改的新对象。

示例代码如下:

>>> list01 = ['a','b','c','b']
>>> list01[3] = 'd'
>>> print(list01)
['a', 'b', 'c', 'd']

列表的循环遍历

1.正向循环

使用for循环从左到右依次遍历列表中的对象,获取到最后一个对象后循环结束,示例代码如下:

>>> list01 = [1,2,3,4,5]
>>> for item in list01:
... 	print(item)
1
2
3
4
5

还可以使用range()方法生成整数序列当作索引值对列表进行循环遍历,示例代码如下:

>>> list01 = [1,2,3,4,5]
>>> for i in range(5): # range(5)生成0 1 2 3 4的数列
... 	print(list01[i]) # i=0时获取到list01[0]的对象,依次类推
1
2
3
4
5

2.反向循环遍历

使用for循环从右到左依次遍历列表中的对象,获取到左边一个对象后循环结束。

使用range()函数构造[-1, -len(list01)]的数列,或者构造[len(list01), 0]的数列,示例代码如下:

# 使用range()函数构造4 3 2 1 0的数列
>>> list01 = [1,2,3,4,5]
>>> for i in range(len(list01)-1, -1, -1):
...		print(list01[i])
5
4
3
2
1
# 使用range()函数构造-1 -2 -3 -4 -5的数列
>>> list01 = [1,2,3,4,5]
>>> for i in range(-1, -len(list01)-1, -1):
... 	print(list01[i])
5
4
3
2
1	

以上两种方式都可以对列表进行从右到左的循环遍历。

列表运算符操作

列表的运算符和字符串运算符相似:

使用’+‘号用于列表拼接,使用’*'号用于列表重复,示例代码如下:

>>> s1 = [1,2,3,4]
>>> s2 = [5,6,7,8]
>>> s3 = s1 + s2 # 列表拼接
>>> print(s3)
[1, 2, 3, 4, 5, 6, 7, 8]
>>> s4 = s1 * 2
>>> print(s4)
[1, 2, 3, 4, 1, 2, 3, 4]

使用in和not in 判断元素是否在列表中,示例代码如下:

>>> s1 = ['a','b','c','d']
>>> print('a' in s1)
True
>>> print('d' not in s1)
True

列表的函数

列表中提供了复制列表、列表排序、反转列表对象等方法,下面介绍一些常用的列表方法:

1.复制列表

copy()方法可以复制列表对象,语法如下:

list.copy()

copy()方法无参数,返回复制后的新列表,只能实现浅层复制,示例代码如下所示:

>>> s1 = [1,2,3,4,5]
>>> s2 = s1.copy()
>>> print(s2)
[1, 2, 3, 4, 5]
# 使用id()函数测试s1,s2的内存地址,分别为不同的内存地址
>>> print(id(s1))
2111392855168
>>> print(id(s2))
2111393092352

2.列表排序

sort()方法可以对原列表进行排序,语法如下:

list.sort(key=None, reverse=False)

参数:

  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse – 排序规则,reverse = True 降序, reverse = False升序(默认)。

返回值:该方法没有返回值,对列表的对象进行排序。

示例代码如下所示:

>>> s1 = [18,2,35,4,5,0,7]
>>> s1.sort() # 默认升序
>>> print(s1)
[0, 2, 4, 5, 7, 18, 35]
>>> s1.sort(reverse=True) # 设置reverse=True降序
>>> print(s1)
[35, 18, 7, 5, 4, 2, 0]
# 自定义函数获取列表的第二个元素
def Second(ele):
    return ele[1]
 
s1 = [(2, 5), (6, 2), (18, 1), (9, 3)]
s1.sort(key=Second)
print (s1)
[(18, 1), (6, 2), (9, 3), (2, 5)]

3.反转列表

reverse()方法用于反转列表中的元素,语法如下:

list.reverse()

无参数,无返回值,对原列表进行反转。示例代码如下所示:

>>> s1 = [18,2,35,4,5,0,7]
>>> s1.reverse()
>>> print(s1)
[7, 0, 5, 4, 35, 2, 18]

4.统计元素出现的次数

count()方法用于统计某个元素在列表中出现的次数,语法如下:

list.count(obj)

参数:

  • obj – 列表中统计的对象

返回值:返回元素在列表中出现的次数。

示例代码如下:

>>> s1 = ['a','c','d','c','b','w','c']
>>> print(s1.count('c'))
3

5.查找元素索引位置

index()方法可以找出某个元素第一次匹配项的索引位置,语法如下:

list.index(x[, start[, end]])

参数:

  • x-- 查找的对象。
  • start-- 可选,查找的起始位置。
  • end-- 可选,查找的结束位置。

返回值:该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。

示例代码如下:

 >>> s1 = ['a','c','d','c','b','w','c']
 >>> print(s1.index('c'))
 1
 >>> print(s1.index('f')) # 查找的对象不在列表中报错
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    print(s1.index('f'))
ValueError: 'f' is not in list

6.清空列表

clear()方法可以一次将列表中的对象清空,语法如下:

list.clear()

无参数,无返回值,直接清空原列表,示例代码如下:

 >>> s1 = ['a','c','d','c','b','w','c']
 >>> print(s1.clear()) # 无返回值时返回None
None
>>> print(s1)
[]

除此以外,还有一些内建函数,例如:max()、min()可以返回列表中的最大值和最小值,但是使用语法和以上函数完全不同,max()、min()、len()、type()都属于Python内建函数,可以作用于Python中的各种数据结构,而上面介绍的六个函数属于列表类中的方法,仅在列表类对象和实例对象中可以被调用,关于类和对象的内容会在面向对象中具体讲解。

猜你喜欢

转载自blog.csdn.net/shield911/article/details/124072382