Bootstrap

Python列表详解

​ 

    上一篇笔记介绍了Python中的数,这篇笔记接下来介绍列表。

    公众号端:

Python 数icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkwMjc0MTE3Mw==&mid=2247483896&idx=1&sn=34429678f88b88efbebb33da6d9de167&chksm=c0a1ac22f7d625340164b8e0e55796b0258cafa4900e17fabd22dd88d0d499cb899d9f8b9997#rd    CSDN端:

[学习笔记]Python学习5——数-CSDN博客文章浏览阅读910次,点赞34次,收藏21次。Pythonhttps://blog.csdn.net/m0_61009360/article/details/141472996

    Python 列表是用于存储多种数据的有序集合。列表是 Python 中最常用的数据结构之一,具有灵活性和强大的功能。本文将从列表的概念、创建方式、常用操作、其他操作方法、性能与优化和应用场景几个方面对列表进行展开介绍。

     欢迎各位关注我的公众号【多棱领域】,为各位分享有趣的知识,共同学习!

一.什么是 Python 列表?

    在 Python 中,列表(List)是一种有序、可变、可以包含任意数据类型元素的数据结构。列表使用方括号”[ ]”来表示,元素之间使用逗号” ,” 分隔。列表是非常常用的数据类型,可以存储多个元素,允许重复元素,并且支持增删改查元素的操作。

    列表的特点可总结如下:

  • 有序:列表中的元素有特定的顺序。

  • 可变:列表中的元素可以改变(添加、删除、修改)。

  • 数据类型任意:可以包含任意数据类型元素。

  • 允许重复:列表可以包含重复的元素。

二.列表的创建

    在 Python 中,可以通过以下几种方式创建列表:

  • 空列表

直接用方括号创建空列表:

empty_list = []
print(type(empty_list))

    输出:

<class 'list'>

  • 包含元素的列表

    要创建一个包含元素的列表,可以直接在方括号中放置元素:

fruits = ["apple", "banana", "cherry"]
print(type(fruits))

输出:

<class 'list'>

  • 创建多维列表

    可以通过列表嵌套的方式创建多维数组或矩阵,例如创建二维数组。

matrix = [
 [1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]
]
print(type(matrix))

输出:

<class 'list'>

  • 使用 list()函数

    以用list函数将其他类型的数据变成列表。

test = list("abcde") # ['a', 'b','c', 'd', 'e']
print(test)
print(type(test))

    输出:

['a', 'b', 'c', 'd', 'e']

<class 'list'>

三. 列表的基本操作

1.访问元素

    可以通过索引来访问列表中的元素,可以进行正向索引和反向索引,索引从 0 开始,负索引从 -1 开始表示从后往前。比如访问上述创建的fruits列表。

print(fruits[0])  # 输出 'apple'
print(fruits[-1]) # 输出 'cherry'

    输出:

apple

cherry

2.修改元素

    通过索引可以修改列表中的元素,例如对上述创建的列表进行修改:

fruits[1] = 'grape'
print(fruits[1])

    输出:

['apple', 'grape', 'cherry']

    即将第二个元素改为'grape'。

3.添加元素

  • 使用 append() 方法:在列表末尾添加一个元素。

fruits.append("orange")
print(fruits)

    输出:

['apple', 'grape', 'cherry', 'orange']

  • 使用insert() 方法:在指定位置插入元素。

fruits.insert(1, "banana")

    输出:

['apple', 'banana', 'grape', 'cherry', 'orange']

4.删除元素

  • 使用 del 语句:删除指定索引的元素或整个列表。比如删除fruits列表中的第一个元素:

del fruits[0]
print(fruits)

输出:

['banana', 'grape', 'cherry', 'orange']


或者删除上述的test列表:

del test # 删除整个列表
  • 使用 pop() 方法:删除指定位置的元素(默认删除最后一个元素),并返回该元素。

last_fruit = fruits.pop()
print(fruits)
print(last_fruit)

    输出:

['banana', 'grape', 'cherry']

orange

  • 使用 remove() 方法:删除列表中首次出现的指定元素。比如继续对fruits列表进行操作:

fruits.append("banana") #使列表有两个banana元素
fruits.remove("banana") #只删除首个出现的banana元素
print(fruits)

    输出:

['grape', 'cherry', 'banana']

5.列表切片

    通过切片操作可以获取部分列表,即提取列表的子列表,例如fruits[1:3] 返回第2个(包括第2个)到第4个元素(不包括第4个)的子列表。

fruits.append("apple")
sub_fruits = fruits[1:3]
print(fruits)
print(sub_fruits)

    输出:

['grape', 'cherry', 'banana', 'apple']

['cherry', 'banana']

四. 其他操作

1.len():获取列表的长度(元素的数量)。

print(len(fruits)) # 输出 4

2.sort():对列表中的元素进行排序。

fruits.sort() # 按字母顺序排序
print(fruits)

    输出:

['apple', 'banana', 'cherry', 'grape']

3.reverse():将列表中的元素反转。

fruits.reverse() # 反转列表
print(fruits)

    输出:

['grape', 'cherry', 'banana', 'apple']

4.extend():将一个列表的所有元素添加到另一个列表中。

more_fruits = ["pear","peach"]
fruits.extend(more_fruits)
print(fruits)

输出:

['grape', 'cherry', 'banana', 'apple', 'pear', 'peach']

5.index():返回指定元素的索引,如果元素不存在则抛出异常。

index = fruits.index("cherry")
print(index)

    输出:

1

    若所给的参数不在列表中:

index = fruits.index("watermelon")
print(index)

    抛出异常:

ValueError                               

Traceback (most recent call last)

Cell In[83], line 1

----> 1 index = fruits.index("watermelon")

2 print(index)

ValueError: 'watermelon' is not in list

6.count():返回列表中指定元素的出现次数。

count = fruits.count("apple")
print(count)

    输出:

1

7.copy():返回列表的浅拷贝。

fruits_copy = fruits.copy()
print(fruits_copy)

    输出:

['grape', 'cherry', 'banana', 'apple', 'pear', 'peach']

8.clear():清空列表中的所有元素。

fruits_copy.clear()
print(fruits_copy)

    输出:

[]

9.遍历

    在 Python 中,列表是可迭代对象,可以通过不同的方式进行遍历,访问列表中的每个元素。以下是几种常见的列表遍历方法:

  • 使用 for 循环直接遍历

    通过 for 循环可以遍历列表中的每个元素,示例代码如下:

for fruit in fruits:
  print(fruit)

    以上代码会依次输出列表 fruits 中的每个水果:

grape

cherry

banana

apple

pear

peach

  • 使用索引遍历

    可以通过索引来遍历列表元素,示例代码如下:

for i in range(len(fruits)):
  print(fruits[i])

    这段代码将逐个输出 fruits 列表中的每个元素,通过索引控制访问顺序。

  • 使用enumerate() 函数遍历

    enumerate() 函数可以同时获得元素的索引值和元素值,示例代码如下:

for n, fruit in enumerate(fruits):
  print(n, fruit)

    这段代码将输出每个水果以及它们在列表中的索引值:

0 grape

1 cherry

2 banana

3 apple

4 pear

5 peach

  • 使用 while 循环遍历

    通过 while 循环也可以遍历列表,示例代码如下:

n = 0
while n < len(fruits):
  print(fruits[n])
  n+=1

    这段代码会依次输出列表中的每个元素,直到列表遍历完毕。

  • 使用列表推导式

    使用列表推导式可以将遍历和处理结合在一起,生成新的列表,示例代码如下:

upper_fruits = [fruit.upper() for fruit in fruits]
print(upper_fruits)

    这段代码将把 fruits 列表中的水果名称转换为大写形式,生成一个新列表:

['GRAPE', 'CHERRY', 'BANANA', 'APPLE', 'PEAR', 'PEACH']

    以上是几种常见的 Python 列表遍历方法,可以根据实际需求和习惯选择合适的遍历方式来操作列表。

五. 列表的性能与优化

1. 列表的底层实现

    Python 的列表是一种动态数组(dynamic array)。这意味着在需要扩展列表时,Python 会分配额外的内存空间,以减少频繁分配内存的开销。因此,列表的操作性能取决于这些底层实现机制。

    列表会进行动态调整大小,当列表的容量不足以容纳新元素时,Python 会自动扩展列表的容量。这种扩展策略减少了由于频繁调整大小带来的性能开销。

2. 时间复杂度

    不同的列表操作具有不同的时间复杂度:

  • 访问元素(通过索引):     O(1)

    由于列表底层是数组,访问特定位置的元素是常数时间操作。

  • 追加元素(append): 平均 O(1)

    在大多数情况下,append 操作是常数时间的,因为它只需在列表末尾添加元素。只有在扩展列表大小时,才需要额外的时间。

  • 插入/删除元素(insert, del, remove): O(n)

    在列表的任意位置插入或删除元素需要移动其他元素,因此时间复杂度为 O(n)。

  • 遍历: O(n)

    遍历整个列表的时间复杂度为 O(n),因为每个元素都需要被访问一次。

  • 列表切片: O(k)

    其中 k 是切片长度。生成列表切片的时间复杂度取决于切片的大小。

3. 性能优化策略

a. 避免频繁插入/删除操作

    由于插入和删除操作的时间复杂度为 O(n),在列表头部或中间插入或删除元素时,尽量减少这些操作的频率。

    优化建议:如果需要频繁在头部或中间进行插入/删除操作,考虑使用 collections.deque,它对两端的插入和删除操作进行了优化。

from collections import deque
​
my_deque = deque([1, 2, 3])
my_deque.appendleft(0) # O(1) 操作
print(my_deque)
my_deque.popleft() # O(1) 操作
print(my_deque)

    输出:

deque([0, 1, 2, 3])

deque([1, 2, 3])

b. 预分配内存

    如果你能够预估列表的最终大小,可以提前创建一个具有固定大小的列表,以避免动态调整大小带来的性能开销。

    优化建议:创建一个固定大小的列表,然后逐步填充它。

n = 1000
my_list = [None] * n # 预分配内存
for i in range(n):
my_list[i] = i * 2

c. 使用列表推导式

    列表推导式在构建列表时比使用循环更高效,尤其是在需要对列表进行某些计算或过滤时。

    优化建议:使用列表推导式来代替循环。

# 使用列表推导式
squares_1 = [x**2 for x in range(10)]
# 等效的循环方法(性能稍差)
squares_2 = []
for x in range(10):
  squares_2.append(x**2)

d. 批量处理数据

    如果你需要对列表进行多次相似的操作(如多个添加或删除操作),尝试将它们合并为一次操作,从而减少 Python 内存管理的开销。

    优化建议:使用 extend方法来一次性添加多个元素,而不是逐一使用 append。

# 一次性添加多个元素
my_list.extend([4, 5, 6])
# 逐一添加
my_list.append(4)
my_list.append(5)
my_list.append(6)

e. 避免使用嵌套列表

    在某些情况下,嵌套列表(例如二维列表)的操作可能会增加代码的复杂性和执行时间。对于大型数据集,考虑使用 NumPy 等库进行优化。

    优化建议:对于数值计算,使用 NumPy 数组代替嵌套列表,因为 NumPy 对数组操作进行了高度优化。

import numpy as np
matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])

f. 使用生成器代替列表

    当只需要一次性迭代大量数据而不需要存储它们时,使用生成器可以节省内存。

    优化建议:使用生成器表达式代替列表推导式。

# 生成器表达式(节省内存)
gen = (x**2 for x in range(1000))
# 列表推导式(占用内存)
lst = [x**2 for x in range(1000)]

六. 列表的应用场景

    Python 列表在实际应用中有很多具体的场景,能够帮助解决各种实际问题。以下是一些常见的 Python 列表在实际项目中的应用场景:

1. 数据存储

    在数据分析和处理任务中,列表常用于收集和存储一组相关数据,例如学生名单、商品清单、传感器读取的数据等。或者在从数据库中检索数据时,通常会将结果存储在列表中,以便后续处理或展示。在网络爬虫和数据抓取中,列表可以用于存储从网页提取的数据,如链接、文本、图片地址等。

2. 批量数据处理

    列表可以用于存储批量数据,并在之后统一进行处理。由于列表可以用来存储和操作各种类型的数据,例如数字、字符串、对象等,并且提供了丰富的方法用于筛选和过滤数据。所以其可以帮助组织和处理数据集,进行排序、过滤、追加等操作。这在数据清理、转换和分析时提供了很大的方便。

3.用户输入管理

    列表可以用于管理用户输入的数据,比如一组选项、答案等。通过添加、删除、修改列表元素,可以更灵活地管理用户数据。

4.文件读写

    列表可以将文件中的数据读取到内存中,或将数据写入文件。列表可以用来存储字符串分割后的单词、句子或文本文件的行等内容,进行文本分析和处理,提取关键信息等。

5.多维数组或矩阵操作

    在科学计算和图像处理领域,列表可以用于表示矩阵或多维数组。

6.实现基本算法

    列表常用于实现基本算法,如排序、查找、筛选等。

    示例:实现冒泡排序。

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:    
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
​
sorted_list = bubble_sort([64, 34, 25, 12, 22, 11, 90])
print(sorted_list)

    输出:

[11, 12, 22, 25, 34, 64, 90]

7.数据结构实现

    列表是一种动态数组,可以用来实现各种数据结构,如堆栈、队列、链表等。通过利用列表的灵活性和操作方法来快速创建自定义数据结构。比如列表可以用来实现简单的队列(先进先出)和栈(后进先出)数据结构。在任务调度或并行处理时,列表可以用来管理任务队列。

8. 图形化显示

    在图形用户界面(GUI)编程中,列表可以用来管理和显示各种控件或选项。例如,用列表来展示菜单选项、文件列表、搜索结果等内容

    Python 列表是一个功能强大且灵活的数据结构,适用于存储和处理各种类型的数据。通过掌握列表的基本操作和方法,可以在编程中有效地管理和操作数据。以上是关于 Python 列表的学习笔记,希望对各位的学习有所帮助!

    最后,如果本篇笔记对大家有帮助,欢迎关注!

;