美文网首页
Python 内置数据结构之五(切片)

Python 内置数据结构之五(切片)

作者: Alexander_Zz | 来源:发表于2019-11-07 10:29 被阅读0次

一、线性结构

1.1 线性结构
  • 可迭代 for ... in
  • len() 可以获取长度
  • 通过下标可以可以访问
  • 可以切片
1.2 前面学习过的线性结构
  • 列表(list)、元组(tuple)、字符串(string)、bytes、bytearray

二、切片

1.1 切片
  • 通过索引区间访问线性结构的一段数据
  • sequence[start:stop] 表示返回 [start, stop) 区间的子序列
  • 支持负索引
  • start 为 0,可省略
  • stop 为末尾,可省略
  • 超过上界(右边界),就取到末尾;超过下界(左边界),取到开头
  • start 一定要在 stop 左边
  • [:] 表示从头至尾,全部元素被取出,等效于 copy() 方法
  • 示例
print('www.rookie.com'[4:10])
print('www.rookie.com'[:10])
print('www.rookie.com'[4:])
print('www.rookie.com'[:])
print('www.rookie.com'[:-1])
print('www.rookie.com'[4:-4])
print('www.rookie.com'[4:50])
print('www.rookie.com'[-40:10])
print(bytearray(b'www.rookie.com')[-4:10])
print(tuple('www.rookie.com')[-10:10])
print(list('www.rookie.com')[-10:-4])
切片示例 - 1.png 切片示例 - 2.png
1.2 步长切片
  • [start: stop: step]
  • step 为步长,可以正、负整数,默认是 1
  • step 要和 start: stop 同向,否则返回空序列
  • 示例
'www.rookie.com'[4:10:2]
list('www.rookie.com')[4:10:-2]
tuple('www.rookie.com')[-10:-4:2]
b'www.rookie.com'[-4:-10:2]
bytearray(b'www.rookie.com')[-4:-10:-2]
'www.rookie.com'[::2]
'www.rookie.com'[::-3]
步长示例.png
1.3 切片赋值
  • 切片操作卸载等号左边
  • 被插入值可迭代对象写在等号右边
  • 示例
a = list(range(5))
a[1:2] = 10   # 右边必须是可迭代对象
a[1:2] = {10, 11}   # [0, 10, 11, 2, 3, 4]
a[1:-1] = ()   # [0, 4]
b = list()
b[:] = a
c = a
print(id(a), id(b), id(c))
赋值示例.png

二、练习

2.1 求素数
  • 方案 1
n = 100000
count = 0

for x in range(2, n):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            break
    else:
        count += 1
#        print (x)

print (count)
方案 1.png
  • 方案 2
  • 利用奇数来计算
n = 100000
count = 1

for x in range(3, n, 2):
    for i in range(3, int(x**0.5)+1, 2):
        if x % i == 0:
            break
    else:
        count += 1
#         print (x)

print (count)
方案 2.png
  • 方案 3
  • 奇数 + 质数列表
  • 合数一定是质数的乘积,合数一定可以找到一个质数整除
n = 100000
count = 1
primenums = []

for x in range(3, n, 2):   # 奇数
    for i in primenums:   # 从质数列表中提取质数
        if x % i == 0:   # 被质数整除了,说明是合数
            break
    else:   # 质数
        count += 1
        primenums.append(x)

print (count)
方案 3.png
  • 方案 4
  • 奇数 + 质数列表
  • 改进,添加判断 “ 中间点 ”,开方值
n = 100000
count = 1
primenums = []

for x in range(3, n, 2):   # 奇数
    flag = True   # 假定为质数
    edge = int(x**0.5)   # 中间点,可提前判断
    for i in primenums:   # 从质数列表中提取质数
        if x % i == 0:   # 被质数整除了,说明是合数
            flag = False
            break
        if i > edge:   # 添加中间点判断,提升效率
            flag = True   # 质数
            break
    if flag:   # 质数
        count += 1
        primenums.append(x)

print (count)
方案 4.png
  • 方案 5
  • 孪生素数
  • 大于 3 的素数只有 6N-1 和 6N+1 两种形式,如果 6N-1 和 6N+1 都是素数,则称为孪生素数
n = 100000
count = 3

x = 7
step = 4

while x < n:
    if x % 5 != 0:
        for i in range(3, int(x**0.5)+1, 2):
            if x % i == 0:
                break
        else:
            count += 1
            
    x += step   # 7
    step = 4 if step == 2 else 2

print (count)
方案 5.png
2.2 杨辉三角
  • 图示


    杨辉三角.png
  • 方案 1

triangle = [[1], [1,1]]   # 所有行

for i in range(2, 6):   # 行
    row = [1]   # 创建新行
    pre = triangle[i-1]
    for j in range(i-1):
        row.append(pre[j] + pre[j+1])
    row.append(1)
    
    triangle.append(row)
    
print (triangle)


n = 1000
triangle = []   # 所有行

for i in range(n):   # 行
    row = [1]   # 创建行
    triangle.append(row)
    if i == 0: continue
        
    pre = triangle[i-1]
    for j in range(i-1):
        row.append(pre[j] + pre[j+1])
    row.append(1)
    
print (triangle)
方案 1.png 方案 1.png
  • 方案 2
  • 补零
n = 1000
oldline = [1]   # 第一行
print (oldline)

for i in range(1,n): 
    oldline.append(0)   # [1,0]
    newline = []
    for j in range(i+1):   # 2
        newline.append(oldline[j-1] + oldline[j])
    print (newline)
    oldline = newline
方案 2.png
  • 方案 3
  • 对称性
n = 1000

triangle = [[1], [1, 1]]   # 所有行

for i in range(2, n):   # 121
    row = [1] * (i + 1)   # 一次性开辟内存空间,效率更高
    triangle.append(row)

    for j in range(i - 1):
        val = triangle[i - 1][j] + triangle[i - 1][j + 1]
        row[j + 1]=val
        row[-(j + 2)] = val

print(triangle)
方案3.png
  • 方案 4
  • 单行覆盖
n = 1000
line = [1] * n   # 一次性开辟优于次次追加

for i in range(n):
    offset = n - i
    swap = 1
    for j in range(1, i//2+1):   # i=3 range(1, 2)
        line[j], swap = swap + line[j], line[j]
        if i ~= 2*j:
              line[-j-offset] = line[j]
    print(line[:i+1])
方案4.png

相关文章

  • Python 内置数据结构之五(切片)

    一、线性结构 1.1 线性结构 可迭代 for ... in len() 可以获取长度 通过下标可以可以访问 可以...

  • python3常用的内置数据结构

    针对python3的内置数据结构,做了个小结,包括概念、内置方法、示例等内容。 python3的内置数据结构总体分...

  • 公共语法

    公共语法 5.1 Python 内置函数 Python 包含了以下内置函数: 5.2 切片 5.3 运算符 成员运...

  • python学习_01

    python的数字类型、字符串、索引、切片讲解 python的数据类型 【重点学习】字符串【表示、索引、切片、内置...

  • 内置数据结构-切片

    切片是对列表、元组、字符串等序列进行操作的一种方法,主要是使用下标/索引来操作下标如果有起始和结束位置,则不包括结...

  • Python内置结构-列表

    1 Python内置数据结构 Python内置了很多数据结构(容器),供我们直接进行使用,在学习结构之前,有一些小...

  • python面试算法

    python内置数据结构算法常考 常用的内置算法和数据结构 sorted排序函数 dict/list/set/tu...

  • python数据结构(二) 高级数据结构

    关于常见的内置类型可参见我的上一篇文章:python数据结构(一) 内置类型. 1. 扩展内置类型 python内...

  • 数据结构和算法(六)

    1. Python 内置数据结构和算法 使用过哪些内置的常用的算法和数据结构 sorted:排序 dict、lis...

  • Python数值型的基础知识和常用数字处理函数

    python的内置数据结构之数值型 1.1数值型的基本类型和概念 int,float,complex,bool都是...

网友评论

      本文标题:Python 内置数据结构之五(切片)

      本文链接:https://www.haomeiwen.com/subject/ggftectx.html