概念:
在Python中,数组(Array)是一种有序的数据集合,用于存储固定数量的相同类型的元素。数组是一个连续的内存空间,可以按照索引访问和修改每个元素。
特点:
- 数组中的元素具有相同的数据类型,可以是数字、字符串或其他类型。
- 数组的大小是固定的,一旦创建,其长度不能改变。
- 可以通过索引值来访问和修改数组中的元素。
- 数组中的元素在内存中是连续存储的。
序列通用操作:
索引/角标:
arr = [1,2,3,4,5,6,7,8,9]
>>>arr[0]
数组正序是从零开始的
1
>>>arr[8]
9
>>>arr[-1] #
倒数第
1
个
9
>>>arr[-2] #
倒数第
2
个
8
>>>arr[-100]
超过范围
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>arr[100]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
序列名[a : b : c] 跟 range(a, b, c) 基本类似
>>>arr[2:] # 从角标
2
开始向尾遍历 步长为
1
正数时为从头开始遍历
[3, 4, 5, 6, 7, 8, 9]
>>>arr[2::2] # 从角标
2
开始向尾遍历 步长为
2
[3, 5, 7, 9]
>>>arr[:6] # 从头开始到角标
6(
不取
)
步长为
1
[1, 2, 3, 4, 5, 6]
>>>arr[:6:3] # 从头开始到角标
6(
不取
)
步长为
3
[1, 4]
>>>arr[:] #
从头到尾
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>arr[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>arr[::2]
[1, 3, 5, 7, 9]
特殊的情况
>>> arr[-1:-7] # 从尾到头
步长必须负数
从倒数第一到倒数第七 此时没有打步长 默认正数 错误
[]
>>> arr[-1:-7:-1]
[9, 8, 7, 6, 5, 4]
>>> arr[-9:7] # 从头到尾 步长为正数
[1, 2, 3, 4, 5, 6, 7]
>>> arr[0:7]
[1, 2, 3, 4, 5, 6, 7]
>>> arr[-9:-2] # 从头到尾 步长为正数
[1, 2, 3, 4, 5, 6, 7]
成员资格 (数组中是否存在该值)
>>> 1 in arr
True
>>> 10 in arr
False
长度与最值
>>> len(arr) #
获取序列的长度
9
>>> max(arr) #数组最大值
9
>>> min(arr) #数组的最小值
1
例:
>>> s = "ABC"
>>> len(s)
3
>>> max(s)
'C'
>>> min(s)
'A
创建
arr
= [] #创建一个空列表
arr = [1, 2, 3, 4] #创建一个有若干元素的列表
arr = [None] * 5 #创建一个有长度但没有值的列表
通过列表解析式来创建
格式:[目标值表达式 for 目标值 in 迭代对象 if ....]
例1:创建1~100当中 能够被3整除 且 能够被5整除 的所有数字
一般情况:
for x in range(1, 101):
if x % 3 == 0 and x % 5 == 0:
print(x)
通过列表解析:
arr = [x for x in range(1, 101) if x % 3 == 0 and x % 5 == 0]
例2:水仙花数
一般情况:
for num in range(100, 1000):
a = num % 10
b = num // 10 % 10
c = num // 100
if a ** 3 + b ** 3 + c ** 3 == num:
print(num)
通过列表解析式:
arr = [num for num in range(100, 1000) if (num % 10) ** 3 + (num // 10 % 10) ** 3 + (num // 100) ** 3 == num]
print(arr)
条件不多时可以使用列表解析式
通过输入来获取元素
n = eval(input()) # n是输入的长度
arr = input().split(" ") # 将输入的数据以空格分割 分割的结果就是列表
但是得到的是字符串而不是纯数字
print(arr)
arr = [int(x) for x in arr] # 将上面的每一个元素都转换为纯数字而不是字符串
print(arr)
遍历问题
arr = [1,2,3,4,5,6,7,8,9]
# 通过角标遍历
for i in range(len(arr)):
print(arr[i])
# 通过foreach遍历
for num in arr:
print(num)
最值问题
# 比较得出最大最小值
maxNum = arr[0]
minNum = arr[0]
for i in range(1, len(arr)):
if arr[i] > maxNum:
maxNum = arr[i]
if arr[i] < minNum:
minNum = arr[i]
print(maxNum)
print(minNum
)
从数组的第一个元素开始,后面的挨个和其进行比较,如果求最大值,后一个元素大于前一个元素,则将后一个元素的值重新赋给maxNum,接着再与其后一个值进行比较。如果求最小值,同理。
存在性问题
# 元素是否存在 遍历数组一个个找
key = 10
for num in arr:
if num == key:
print("存在")
break
else:
print("不存在")
# 元素在哪个位置 从左到右第1次出现的角标 不存在返回-1
key = -4
index = 0
for i in range(len(arr)):
if arr[i] == key:
index = i
break
else:
index = -1
print(index)
翻转问题
arr = arr[-1::-1] #从尾到头开始
print(arr)
for i in range(0, len(arr) // 2):
j = len(arr) - 1 - i
arr[i], arr[j] = arr[j], arr[i]
print(arr)
left = 0 #一个在第一个 一个在最后一个 一路交换过来
right = len(arr) - 1
while left <= right:
arr[left], arr[right] = arr[right], arr[left]
left += 1
right -= 1
print(arr)
查找算法
二分查找
要求数据必须有序
arr = [1,2,3,4,5,6,7,8,9]
minIndex = 0
maxIndex = len(arr) - 1
midIndex = (minIndex + maxIndex) // 2 #先建立三个值的位置分别是头,尾,中间
key = 8
while arr[midIndex] != key: #判断给的值是否等于中间值 此时是不等于
if arr[midIndex] < key: #当中间值小于要找的值
minIndex = midIndex + 1 #则将最小值移到中间值的后一个位置上
else:
maxIndex = midIndex - 1 #如果中间值大于要找的值 则将最大值移到中间值 的前一个位置
if minIndex > maxIndex: #如果最小值的位置出现在最大值右边的 那么数组中不存在要找的值
midIndex = -1
break #midlndex返回 -1 break结束循环
midIndex = (minIndex + maxIndex) // 2
print(midIndex) #最后midlndex会选中要找的值或者没有 打印 midlndex