1. 什么是数组?(python中的列表)
分类:线性表(Linear List)。在内存中体现为一段连续的空间。在Java、Python、Javascript有共同点,也有不同点。
2. 数组/列表的特点
- 根据下标访问是O(1),其他访问是O(n)--遍历
- 修改是O(1)(根据下标修改)
- 删除、插入涉及数据的移位 O(n):平均移动的数据的个数:E=1 * 1/n + 2 * 1/n + 3 * 1/n …… + n * 1/n=(n+1)/2。其中1/n是可以插入位置的概率都一样都是1/n。
- 下标都是从0开始。
3. Python语言中的数组
3.1 Python中的数组就是我们所说的列表(list)
- 在Python中,数组是一种有序的集合,可以存储相同或不同类型的元素(Java只能存储相同类型的元素)。
- 它是一个可变长度的数据结构(Java声明时指定数组的长度/大小),可以根据需要动态调整大小。
- 在Python中,数组通常被称为列表(list),它用方括号[]表示,并且可以包含任意类型的元素。
例如,下面是一个包含整数和字符串的数组的示例:
arr = [1, 2, 3, "hello", "world"]
数组的优点是可以在O(1)的时间复杂度内访问和修改元素,而不需要遍历整个数组。此外,数组还提供了许多内置的方法,如添加元素、删除元素、查找元素等。
需要注意的是,在Python中的数组(列表)与其他编程语言中的数组有一些区别。Python的数组可以存储不同类型的元素,并且可以根据需要动态调整大小,这使得它更加灵活
3.1.1 声明
1. 使用方括号 [] 声明一个空列表
arr = []
2. 在方括号内添加元素来声明具有初始值的列表:
arr = [1, 2, 3, 4, 'Allen']
3. 使用 list() 函数声明一个空列表:
arr = list()
4. 使用 list() 函数和可迭代对象(如字符串、元组等)来声明具有初始值的列表:
arr = list("hello") # ['h', 'e', 'l', 'l', 'o']
Python的列表可以存储不同类型的元素,并且可以根据需要动态调整大小。Java声明时必须指定类型、大小。
3.1.2 获取列表的长度: len(arr)
获取列表的长度:可以使用 len() 函数获取列表中元素的个数。
arr = [1, 2, 3, 4, 5] print(len(arr)) # 输出: 5
3.1.3 访问列表中的元素
有2种方式:
1. 根据下标访问,从0开始。
2. for、for-each、range等遍历
1. 访问列表中的元素:可以使用索引操作符 [] 来访问列表中的元素,索引从0开始计数。
arr = [1, 2, 3, 4, 5] print(arr[0]) # 输出: 1
2. 使用for循环遍历数组
arr = [1, 2, 3, 4, 5] for i in range(len(arr)): print(arr[i])
使用for循环和range()函数来遍历数组arr。range(len(arr))将会生成一个从0到len(arr)-1的整数序列,然后通过索引i访问数组中的元素。
输出:
1 2 3 4 5
3. 使用for-each循环遍历数组:
arr = [1, 2, 3, 4, 5] for num in arr: print(num)
使用for-each循环直接遍历数组arr中的元素,每次迭代时将当前元素赋值给变量num。
特别需要注意2点:
1. for-each遍历时,不要修改元素
2. python的for-each是按列表顺序遍历。而Java是随机遍历
输出:
1 2 3 4 5
坑: 在循环中修改列表时,需要小心。如果在迭代过程中添加或删除元素会导致迭代出错。
my_list = [1, 2, 3, 4, 5] for num in my_list: if num % 2 == 0: my_list.remove(num) print(my_list) # 输出: [1, 3, 5]
试图在循环中删除所有偶数。但是,由于在循环过程中修改了列表,导致循环跳过了某些元素(如2),结果不如预期。
要解决这个问题,可以创建一个新的列表来存储要删除的元素,然后在循环结束后统一删除它们。或者,可以使用列表推导式或filter()函数来过滤出要保留的元素。
my_list = [1, 2, 3, 4, 5] to_remove = [] for num in my_list: if num % 2 == 0: to_remove.append(num) # 循环结束后删除要删除的元素 for num in to_remove: my_list.remove(num) print(my_list) # 输出: [1, 3, 5]
my_list = [1, 2, 3, 4, 5] # 使用列表推导式过滤出要保留的奇数 my_list = [num for num in my_list if num % 2 != 0] print(my_list) # 输出: [1, 3, 5]
my_list = [1, 2, 3, 4, 5]
# 使用列表推导式过滤出要保留的奇数
my_list = [num for num in my_list if num % 2 != 0]
print(my_list) # 输出: [1, 3, 5]
3.1.4 修改列表中的元素
修列表是可变的,可以通过索引操作符 [] 来修改其中的元素。
arr = [1, 2, 3, 4, 5] arr[0] = 10 print(arr) # 输出: [10, 2, 3, 4, 5]
salaries[1:3] = [6500, 7500] # 将第二个和第三个员工的工资修改为6500和7500
3.1.5 列表添加元素
1. 使用 append() 方法将元素添加到列表的末尾。
arr = [1, 2, 3] arr.append(4) print(arr) # 输出: [1, 2, 3, 4]
2. 使用insert(索引,元素)方法在指定位置插入数据
my_list = [1, 2, 3] # 在索引为1的位置插入元素4 my_list.insert(1, 4) print(my_list) # 输出: [1, 4, 2, 3]
3. 使用extend()方法或使用+=操作符一次添加多个元素
my_list = [1, 2, 3] # 使用extend()方法添加多个元素 my_list.extend([4, 5, 6]) print(my_list) # 输出: [1, 2, 3, 4, 5, 6] # 使用+=操作符添加多个元素 my_list += [7, 8, 9] print(my_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
3.1.6 删除元素
删除列表中的元素:可以使用 del 关键字或 remove() 方法删除列表中的元素。
arr = [1, 2, 3, 4, 5] del arr[0] print(arr) # 输出: [2, 3, 4, 5] arr.remove(3) print(arr) # 输出: [2, 4, 5]
3.1.7 列表当作实参传递时
列表是可变对象,在函数参数传递时要特别注意。如果将列表作为参数传递给函数,函数可能会修改原始列表。
如果不想修改原始列表,可以使用切片操作符或创建副本来传递一个新的列表给函数。
1. 使用切片操作符创建一个新的列表并将其传递给函数。
def func(my_list): # 在函数中对my_list进行操作 my_list = [1, 2, 3, 4, 5] new_list = my_list[:] func(new_list )
2. 使用列表的copy()方法创建一个副本,并将其传递给函数
def func(my_list): new_list = my_list.copy() # 浅拷贝 # 在函数中对new_list进行操作 my_list = [1, 2, 3, 4, 5] func(my_list)
3. 深拷贝
import copy def func(my_list): new_list = copy.deepcopy(my_list) # 在函数中对new_list进行操作 my_list = [1, 2, 3, 4, 5] func(my_list)
3.1.8 列表的合并与拆分
使用+操作符可以将两个列表合并为一个新的列表。这个操作符非常简单,只需要将两个列表用+连接在一起即可
# 创建两个列表 list1 = [1, 2, 3] list2 = [4, 5, 6] # 使用+操作符合并两个列表 combined_list = list1 + list2 # 打印合并后的列表 print(combined_list)
输出结果:
[1, 2, 3, 4, 5, 6]
通过使用+操作符,我们将list1和list2两个列表合并成了一个新的列表combined_list。合并后的列表包含了两个原始列表中的所有元素。
需要注意的是,这种方法创建了一个新的列表,而不是修改原始列表。原始列表list1和list2保持不变。
此外,你也可以使用这种方法合并多个列表,只需要依次使用+操作符连接它们即可
拆分列表的操作不是通过+操作符来实现的,而是通过切片来完成的。如果你想从一个列表中获取一部分元素,可以使用切片操作
# 创建一个列表 my_list = [1, 2, 3, 4, 5] # 使用切片获取列表的一部分 subset = my_list[1:4] # 打印获取的子列表 print(subset)
输出结果:
[2, 3, 4]
使用切片[1:4]从my_list中获取了索引1到3的元素,包括索引1但不包括索引4。这样就实现了从一个列表中拆分出一个子列表。
3.1.9 排序
sort() 方法用于对列表进行排序。默认情况下,它会按照升序(从小到大)的顺序对列表进行排序,但你也可以通过参数来指定降序排序。
列表的sort方法会改变原列表的内容
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] # 使用 sort() 方法对列表进行升序排序 numbers.sort() print(numbers)
输出结果:
[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] # 使用 sort() 方法对列表进行降序排序 numbers.sort(reverse=True) print(numbers)
输出结果:
[9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
如果你想对一个列表进行排序但又不想改变原始列表,可以使用sorted()函数。sorted()函数会返回一个新的已排序列表,而不会修改原始列表
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] # 使用 sorted() 函数对列表进行升序排序 sorted_numbers = sorted(numbers) # 打印排序后的新列表 print(sorted_numbers) # 原始列表仍然保持不变 print(numbers)
输出:
[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
如果你想要对列表进行降序排序,可以使用reverse=True参数:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] # 使用 sorted() 函数对列表进行降序排序 sorted_numbers_descending = sorted(numbers, reverse=True) # 打印降序排序后的新列表 print(sorted_numbers_descending) # 原始列表仍然保持不变 print(numbers)
输出结果:
[9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1] [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
3.1.10 颠倒顺序
reverse() 方法用于反转列表中的元素的顺序。它不会对元素进行排序,只是将列表中的元素颠倒顺序。
fruits = ["apple", "banana", "cherry", "date"] # 使用 reverse() 方法反转列表中的元素顺序 fruits.reverse() print(fruits)
输出结果:
['date', 'cherry', 'banana', 'apple']
需要注意的是,reverse() 方法只是颠倒元素的顺序,不会对元素进行排序。如果你想同时对列表进行排序和反转,可以先使用 sort() 方法排序,然后再使用 reverse() 方法反转。
分类
一维
二维
三维
n维