1.12 数组列表与字符串

序列:存储一堆数据的集合/容器

列表、字符串、元组、集合、字典

序列通用操作

索引/角标

>>> arr[0] 1

>>> arr[8] 9

>>> arr[-1] # 倒数第1个 9

>>> arr[-2] # 倒数第2个 8

>>> arr[-100]

Traceback (most recent call last): File "", line 1, in IndexError: list index out of range

>>> arr[100]

Traceback (most recent call last): File "", line 1, in 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

>>> len(arr)

9

>>> max(arr)

9

>>> min(arr)

1

>>> s = "ABC"

>>> len(s)

3

>>> max(s)

'C'

>>> min(s)

'A'

常见操作

创建问题

"""

列表

1.存储多个数据 数据不一定都是同一个类型 但是为了方便操作 建议存一样的类型

2.可以通过索引/角标来访问元素

3.可变长的数组 我们后续可以在列表中进行 增 删

4.用一对中括号[ ]

"""

# 创建一个的列表

arr = []

print(arr)

# 创建一个具有若干元素的列表

arr = [1, 2, 3, 4]

print(arr)

# 创建一个具有长度但是没有值的列表

arr = [None] * 5

print(arr)

# 通过【列表推导式/解析式】来进行创建

# [目标值表达式 for 目标值 in 迭代对象 if ....]

# 创建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]

       对象        循环                             条件

print(arr)

# 创建1~100当中 偶数

arr = [x for x in range(1, 101) if x % 2 == 0]

print(arr)

# 水仙花数

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)

arr = [x * 3 + "哈哈" for x in "ABCDEFG"]

print(arr)

# 通过输入来获取元素

"""

5 "1" "2" "3" "4" "5"

"""

n = eval(input())

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)

最值问题

arr = [1,2,3,4,5,6,7,8,9]

# 最大值

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)

存在性问题

arr = [1,2,3,4,5,4,6,4,7,8,9]

# 元素是否存在

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 = [1,2,3,4,5,6,7,8,9,10]

# 0 1 2 3 4 5 6 7 8

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)

排序算法

  1. 选择排序
  2. 冒泡排序
  3. 插入排序
  4. 查找算法
  • 希尔排序
  • 快速排序
  • 堆排序
  • 归并排序
  • 计数排序
  • 基数排序
  • 桶排序
  • 斐波那契查找

二分查找

:要求数据必须有序 ,只考虑位置

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
        midIndex = (minIndex + maxIndex) // 2
print(midIndex)

 

插值查找

“特点:每个值前面都是有序的 ,除了要考虑位置还得考虑元素的分布情况

"""
插值查找:根据所求值的范围比例来求值的位置
步骤:
1.创建一个比较均匀的数组
2.初始化
low 区间最小值角标
high 区间最大值角标
mid 区间中间值角标
mid =int ((key - arr [low]) / (arr[high] - arr[low]) * (high - low)) + low
3.创建一个循环:
如果mid值比key小,去掉左边的部分,low与mid发生更改
如果mid值比key大,去掉右边部分,high值变为mid-1,mid重新计算
如果mid = key,循环结束
如果low>high,找不到,循环结束
"""
arr = [2,4,6,8,10,12,14,16,18,20]
low = 0
high = len(arr) - 1
mid = 0
key = 8

while True :
    mid =int((key - arr[low]) / (arr[high] - arr[low]) * (high - low)) + low
    if arr[mid] < key:
        low = mid + 1
    elif arr[mid] > key:
        high = mid - 1
    elif low > high:
        mid = -1
        break
    else:
        break
print(mid)

列表对象函数

对象函数是区别于内置函数的,内置函数直接调用即可len() max()

对象函数 必须通过某一个具体的对象来调用 列表.函数名()

  • append()
  • 将某一个元素对象添加在列表的表尾
  • 如果添加的是其他的序列,该序列也会被看成是一个数据对象
arr = [1,2,3,4]
arr.append(5)
print(arr)
arr2 = [6,7,8]
arr.append(arr2)
print(arr)
  •  count()
  • 统计列表当中 某一个元素出现的次数
arr = [1,2,3,4,1,2,3,1,1,2,0,0,1]
print(arr.count(1)) //1出现的次数
  • extend()
  • 在当前列表中 将传入的其他序列的元素添加在表尾
arr1 = [1,2,3]
arr2 = [4,5,6]
arr1.extend(arr2)
print(arr1)
"""
不能是数字,数字不属于序列
arr1.extend(7)
TypeError: 'int' object is not iterable(可迭代的=序列)
"""
arr1.extend("ABC")
print(arr1)

 

  •  index()
  • 查找(从左到右)元素第一次出现的位置(角标)
arr = [1,2,3,4,5,6,7,4,5,6,9]
print(arr.index(4))
print(arr.index(4, 5, 8)) #[5, 8) 区间中找4的角标
"""
print(arr.index(10))
ValueError: 10 is not in list 找不到则报错
  •  insert(index, obj)

    在某一个角标出处插入一个元素

arr = [1,2,3,4]
arr.insert(2, 5)
print(arr)

 

  • pop()
  • 弹栈删除最后一个元素 并返回其值
  • 也可以删除指定角标处的元素
arr = [1,2,3,4]
print(arr.pop())
print(arr)
print(arr.pop(1))
print(arr)

 

  • remove()
  • 移除 从左到右第一次出现的 指定元素  
    arr = [1,2,3,4,2,3,4,2,3,4]
    arr.remove(4)
    print(arr)
    

  • reverse()
  • 翻转列表
arr = [1,2,3,4]
arr.reverse()
print(arr)
  • sort()
  • 排序(以序列的长度为基准进行排序)
arr = [4,2,5,2,6,2,7,9,4,7,2,7]
arr.sort() # 默认升序
arr.sort(reverse = True) # 降序
arr = ["ABC", "123123123","我爱你中国","123123123","kasdkjas"]
arr.sort(key = len) # 以序列的长度为基准进行排序
print(arr)

  • clear()
  • 清空 
arr = [1,2,3,4]
arr.clear()
print(arr)
  •  copy()
  • 复制一个列表(浅拷贝)
    arr1 = [1,2,3,4]
    arr2 = arr1.copy()
    print(arr1 == arr2) # True 比较的是内容
    print(arr1 is arr2) # False 比较的是对象地址
    print(arr1)
    print(arr2)
    arr1[0] = 5
    print(arr2[0])
    # 上述代码在arr1中修改元素 并不影响arr2
    

  • arr1[0] = 5 后,arr2[0]不影响

arr1 = [1,2,3,[4,5,6]]
arr2 = arr1.copy()
arr2[0] = 7
print(arr1[0])
print(arr2[0])
arr2[3][0] = 666
print(arr1[3])
# 上述代码在arr2中修改元素 影响arr1
arr2[3] = [9,9,9]
print(arr1[3])
print(arr2[3])

 

  • del关键字
  • 删除 
arr = [1,2,3,4]
del arr[0] # 删除序列中的元素
print(arr)
del arr # 删除变量
"""
NameError: name 'arr' is not defined. Did you mean: 'arr2'?
print(arr)
"""

 字符串对象函数

  • 可变对象与不可变对象
  • 列表是可变对象:可以修改列表中的元素 甚至长度
  • 字符串是不可变对象:不可以修改字符串中的元素 包括 长度
  • 注意:也就意味着对字符串的修改 一律不是在本身修改 而是创建一个新的字符串!
arr = [1,2,3]
arr[0] = 4
"""
>>> arr
[4, 2, 3]
"""
s = "ABC"
"""
>>>s[0]
'A'
"""
s[0] = "D"
"""
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
字符串对象不支持元素修改
"""

 

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值