python编程入门理解

关于本项目的说明

本人测试小白,为了强化有关代码方面的能力,如今每天做好一个算法题,并探讨明了题目中使用到的相关python语法,数据结构等。在此项目中做一个简单的讲解与记录。

牛客网题目

从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,找出这n个数中缺失的那个数,要求O(n)尽可能小。

牛客网最快解题代码

class Solution:
    def solve(self , a ):
        # write code here
        for i in range(1, len(a)):
            if a[i] - a[i - 1] == 2:
                return a[i] - 1
        return 0;

使用集合的解题思路

class Solution:
    def solve(self , a ):
        b=list(range(a[-1]+1))
        #生成list
        seta=set(a)
        setb=set(b)
        #把list转化为集合
        setc=setb^seta
        #比较集合中不同的元素
        return list(setc)[0]
        #由于集合无法遍历或取出元素,仅仅计算效率较高,所以最后返回的结果还需转化为list再取出

关于python集合的说明

python中的集合是和元组(tuple)、列表(list)相同级别的基础数据类型,但元组和列表均是可序列化的数据类型,而集合是一种不可有重复元素的无序且不可遍历的数据类型,因此,仅仅可以在运算时具有很强优势,但不可以遍历以及序列化。

初始化集合

初始化集合仅仅可以使用如下方法

emptySet = set()

初始化一个带函值的集合可以传入一个list

dataScientist = set(['Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'])
dataEngineer = set(['Python', 'Java', 'Scala', 'Git', 'SQL', 'Hadoop'])

集合元素的添加与删除

集合元素的添加

添加集合元素如下所示

graphicDesigner.add('Illustrator')

注意,向集合中添加的元素仅仅可以是字符串或元组,这样不可变的元素,而list是可以变的元素,向集合中添加会导致程序返回type error

集合元素的删除

删除集合元素共有四种方法,remove,discard,pop,clear
其中remove可以删除指定元素,如果被删除元素不存在则返回key error

graphicDesigner.remove('Illustrator')

discard与remove方法类似,但如果删除不存在元素不会报错

graphicDesigner.discard('Illustrator')

pop方法删除集合中任意一个值,但如果集合是空的则返回key error
clear方法可以删除集合中所有的值

集合的“序列化”

不知道“序列化”一词使用的是否准确,但如果我们吧集合变为一个有序列表则可以使用如下方法

type(sorted(dataScientist))

四种集合运算方法

下面我们来说明一下我们常用的四种集合运算方法

>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b                              # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b                              # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}

关于前文两种算法的总结

如果使用for循环遍历,那么将会把较为短小的list找寻结果变快,或使用二分法,可以进一步减小内存,加快速度,但使用集合方法,可以快速比对数据,在较大list的寻值中快速找到相关数据,并且通用性更强。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值