python学习-进阶

本文介绍了Python中的数据结构与算法应用,包括生成式用于创建列表、集合、字典,heapq模块实现堆排序,itertools模块进行全排列、组合及笛卡尔积计算,以及collections模块的数据结构。此外,还展示了选择排序、冒泡排序、搅拌排序的实现,并讨论了排序算法的时间复杂度。最后,演示了如何合并两个有序列表以及顺序查找和折半查找的方法。
摘要由CSDN通过智能技术生成

知识点

生成式(推导式)用法

生成式 用来生成列表、集合、字典。

prices = {
    'AAPL': 191.88,
    'GOOG': 1186.96,
    'IBM': 149.24,
    'ORCL': 48.44,
    'ACN': 166.89,
    'FB': 208.09,
    'SYMC': 21.29
}
# 用股票价格大于100元的股票构造一个新的字典
prices2 = {key: value for key, value in prices.items() if value > 100}
print(prices2)

在这里插入图片描述

嵌套的列表

我对他的理解就是C语言中的二维数组
在这里插入图片描述

herpq 模块(堆排列)

import heapq    ##导包

list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]   ##一个列表
list2 = [                                          ##一个嵌套列表,嵌套的字典
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]
print(heapq.nlargest(1, list1))      ## 列表中 最大的1个
print(heapq.nsmallest(3, list1))     ## 列表中 最小的3个
print(heapq.nlargest(2, list2, key=lambda x: x['price']))   ##以key:price来找出最大的2
print(heapq.nlargest(2, list2, key=lambda x: x['shares']))  ##以key:shares来找最小的2

在这里插入图片描述

itertools模块

import itertools

itertools.permutations('ABCD') # 产生ABCD的全排列

itertools.combinations('ABCDE', 3)# 产生ABCDE的五选三组合

itertools.product('ABCD', '123')# 产生ABCD和123的笛卡尔积

itertools.cycle(('A', 'B', 'C'))# 产生ABC的无限循环序列

在这里插入图片描述

collections模块

用到再看。

数据结构

算法:解决问题的步骤和方法
用时间复杂度和空间复杂度判断算法的好坏【现在一般除了嵌入式领域,一帮都不看空间复杂度,现在的硬件的大小远远够用的】
一般用O(n)来表示。有常数时间复杂度、对数时间复杂度、线性时间复杂度、平方时间复杂度、阶乘时间复杂度。
以上就是一些概念。一些简单的算法
排序算法。

  1. 简单的选择排序
def select_sort(items):  #lambda 是匿名函数,定义一个函数,比较大小的
    for i in range(len(items)-1):                ##下标从0开始的。所以减一 ,开始遍历
        print("排%s次"%(i+1))
        min_index =i                             ##起始的下标为0
        for j in  range(i+1,len(items)):         ##这个循环是找到最小元素的下标。
            if items[j]<items[min_index]:  ##
                min_index=j
        items[i],items[min_index]=items[min_index],items[i]    ##把小的元素往前移。
        print("得到%s"%items)
    return items

import random
li=list(range(8))
random.shuffle(li)  ##随机生成
print(li)
select_sort(li)
print(li)

在这里插入图片描述

  1. 冒泡排序
    冒泡排序,相邻的两个元素比较,将小的对调的前面。用了两个循环。先把最大的元素放到了最后,把最小的元素往前放。完成一次内循环就将最大的元素移到了最后。内循环中减 i 的目的少一次循环(不管已经找到的大元素)。
def bubble_sort(items):
    for i in range(len(items) - 1):
        swapped = False
        for j in range(len(items) - 1 - i):           #直接对换元素,
            if  items[j]> items[j + 1]:
                items[j], items[j + 1] = items[j + 1], items[j]
                swapped = True
                print("排序第%s和%s结果:%s"%(j,j+1,li))
        if not swapped:
            break
    return items

import random
li=list(range(9))
random.shuffle(li)
print("随  机  列  表:%s"% li)
bubble_sort(li)
print(li)

在这里插入图片描述

  1. 搅拌排序(升级版的冒泡排序)
    两头排,把大的排一遍,在把小的排一遍
def bubble_sort(items):
    for i in range(len(items)-1):
        swapped = False
        for j in range(len(items)-1-i):       #这个循环完成就将最大元素放到最后
            if items[j]>items[j+1]:
                items[j],items[j+1]=items[j+1],items[j]
                print("第%s和第%s位交换后:%s"%(j,(j+1),items))
                swapped=True
        if swapped:
            swapped=False
            #这里,已经完成了最大元素的排序,就可以少一次循环
            #这个循环是找最小的移动到最前面,
            for j in range(len(items)-2-i,i,-1):  #注意哦这里的j的取值是倒序的。
                if items[j-1]>items[j]:  
                    items[j],items[j-1]=items[j-1],items[j]
                    print("第%s和第%s位交换后:%s" % (j, (j + 1), items))
                    swapped=True
        if not swapped:
            break
    return items
import random
li=list(range(9))
random.shuffle(li)
print("随机生成列表%s:"%li)
bubble_sort(li)
print("拍列完成%s"%li)

在这里插入图片描述

  1. 合并
#合并两个有序列表为有序列表
def merge(items1,items2):
    items=[]  #空列表
    nm1,nm2=0,0           #分别用来控制两个有序列表的。
    while nm1<len(items1) and nm2<len(items2):
        if items1[nm1]<items2[nm2]:    #按序比较两个列表的元素
            items.append(items1[nm1])  ##将小的那个元素追加到items中。
            nm1+=1
        else:
            items.append(items2[nm2])
            nm2+=1
    items+=items1[nm1:]     ##拼接剩下的
    items+=items2[nm2:]
    return items

import random
li1=[1,3,5,7,9]
li2=[0,2,4,6,8]
li=merge(li1,li2)
print(li)

结果在这里插入图片描述

  1. 顺序查找
    这个循环就按照顺序,一个一个对比来找。
def seq_search(items,key):
    for index,item in enumerate(items):   #enumerate枚举  index 用于下标
        if item==key:
            return index
    return -1
li=[1,5,0,9,3,8,6,4,2,7]
l=seq_search(li,6)
print(l)
  1. 折半查找
    从中间开始比较大小,一步一步缩小范围,从而找到元素。
#折半查找
def bin_search(items,key):
    start,end=0,len(items)-1  #首尾
    while start<=end:        ##循环条件,不满足时 查找不到
        mid=(start+end)//2     ##取中间的下标
        if key>items[mid]:
            start=mid+1
        elif key<items[mid]:
            end=mid-1
        else:
            return mid
    return -1
li=[1,4,2,5,3,6,0]
l=bin_search(li,5)
print(l)

在这里插入图片描述

常用算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值