01:数据结构和算法

*** :“_” 占位变量 (须保证你选用的那些占位变量名在其他地方没被使用到,一般选用 "_")

  data = [ ‘ACME‘, 50, 91.1, (2012, 12, 21) ]

   _, shares, price, _ = data

*** : 解压变量 *para

  *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3]#该方法需要保证current能获取到一个值(python3适用)

*** : collections python 容器数据类型

  ----Counter是对字典的型的补充,它继承了dict类,用于追踪迭代项出现次数。

    para = [‘home‘, ‘dir‘, ‘cmd‘, ‘home‘, ‘list‘,‘dir‘]

    res = Counter(para)   #Counter({‘home‘: 2, ‘dir‘: 2, ‘cmd‘: 1, ‘list‘: 1})
    res 具有字典的一切特效,同时还具有特别的特性

    list(res.elements())   #[‘home‘, ‘home‘, ‘cmd‘, ‘list‘, ‘dir‘, ‘dir‘]
    res.most_common(3)  # [(‘home‘, 2), (‘dir‘, 2), (‘cmd‘, 1)]

    new = Counter([‘home‘])   

    res.substract(new)#同res - new。    #结果Counter({‘dir‘: 2, ‘home‘: 1, ‘cmd‘: 1, ‘list‘: 1})

  ----OrderedDict 能够记录字典元素插入的顺序,常常和排序函数一起使用来生成一个排序的字典。()

    res = {‘banana’:3,’apple’:4,’pear’:1,’orange’:2}

    OrderedDict(sorted(d.items(),key = lambda t:t[0]))#字典安装先后生成顺序

    
  ----defaultdict属于内建函数dict的一个子类,python自动的为它的键赋了一个初始化值

    dic = defaultdict(int) #表示用一个int()函数作为参数出给defaultdict,我们不带参数调用int(),int()就会返回一个0值

   dic[‘value‘] += 1#不会报错

 ---- ChainMap  接受多个字典并将它们在逻辑上变为一个字典。(并不是真正合并成一个字典)   c = ChainMap(a,b)   两个字典中执行查找操作是:先从 a 中找,如果找不到再在 b 中找。

 ---- deque   deque是双端队列,可以从两端塞元素进去,也可以从两端取元素;  deque是线程安全的,可以用来做多线程的共享资源   res = deque([1,2,3,2,4])   #双端操作,同列表。append/appendleft, extend/extendleft(其实如同一个元素使用append或者appendleft),pop/popleft,remove/reverse   rotate :  #res.rotate(-2)  从右往左旋转 此时 res = deque([3,2,4,1,2])      res = deque([1,2,3,4,5,6,7], maxlen=4) #res = deque([4,5,6,7])  #表示定长为4的队列

 ---- namedtuple 命名元组命。名元组另一个用途就是作为字典的替代   如果你需要构建一个非常大的包含字典的数据结构,那么使用命名元组会更加高效。 但是需要注意的是,不像字典那样,一个命名元组是不可更改的。   如果你真的需要改变然后的属性,那么可以使用命名元组实例的 _replace() 方法, 它会创建一个全新的命名元组并将对应的字段用新的值取代。   如果你的目标是定义一个需要更新很多实例属性的高效数据结构,这时候你应该考虑定义一个包含 __slots__ 方法的类   person = namedtuple(‘P‘, ‘name age gender‘)或者 person = namedtuple(‘P‘, [‘name‘, ‘age‘, ‘sex‘])   obj = person(name = ‘holen‘, age = 25, sex = ‘male‘)或者obj = person(‘holen‘, 25, ‘male‘)#类似python种对象的使用   obj = obj._replace(age=75)#改变命名元组的值   使用namedtuple时候,不能使用关键字。同时,字串或者列表的值不能重复。   可以使用如下的保证:   person = namedtuple(‘P‘, ‘name age gender age‘, rename=True)   此时查看person._fields  # name, age, gender, _3   _3表示索引位置为3的元素已经重复

*** :  heapq 堆数据结构  堆数据结构最重要的特征是 iterable[0] 永远是最小的元素。   ---- heapq.nlargest(n, iterable[, key])/heapq.nsmallest(n, iterable[, key])    (从迭代器对象iterable中返回前n个最大/小的元素列表,key用于匹配是字典对象的iterable,用于更复杂的数据结构中。)    如果n的大小和集合大小接近的时候,效率不如sort.  ----  heapq.heapify(iterable)         #将iterable转换成堆. iterable 为定义的堆,无返回值。  ---- headpq.pop(iterable)           #先将第一个元素弹出来,然后用下一个最小的元素来取代被弹出元素  ---- heapq.heappush(iterable,item)      #iterable为定义堆,item 增加的元素.  ---- heapq.heapreplace(iterable, item)     #删除最小元素值,添加新的元素值  ---- heapq.heappushpop(iterable, item)     #首判断添加元素值与堆的第一个元素值对比,如果大于则删除最小元素,然后添加新的元素值,否则不更改堆  ---- heapq.merge(iterable, iterable1)      #将多个堆合并,返回一个合并后的迭代
  ---- izip, imap, islice, tee  

import heapq
#优先队列
#在上面代码中,队列包含了一个 (-priority, index, item) 的元组。 优先级为负数的目的是使得元素按照优先级从高到低排序。 这个跟普通的按优先级从低到高排序的堆排序恰巧相反。
#index 变量的作用是保证同等优先级元素的正确排序。 通过保存一个不断增加的 index 下标变量,可以确保元素按照它们插入的顺序排序。 而且, index 变量也在相同优先级元素比较的时候起到重要作用。

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]


*** :  列表去重(保持原来顺序)

#1
def dedupe(items):
    seen = set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

a = [1, 5, 2, 1, 9, 1, 5, 10]
list(dedupe(a)) #[1, 5, 2, 9, 10]

#2
OrderedDict.fromkeys(a).keys()

#3
seen = set()
 seen_add = seen.add
[x for x in a if not (x in seen or seen_add(x))]


*** :  slice 切片对象  ---内置的 slice() 函数创建了一个切片对象,可以被用在任何切片允许使用的地方。    一个切片对象a,你可以分别调用它的 a.start , a.stop , a.step 属性    a = [1,2,3,4,5,6,7]     s = slice(3,50)    a[s] #同a[3:50]    s.indices(len(a)) #-->所有值都会被合适的缩小以满足边界限制返回slice(3, 7, 1)该方法将它映射到一个确定大小的序列上, 返回一个三元组 (start, stop, step)
*** :  根据某个或某几个迭代项的字段来排序这个迭代   ---operator 模块的 itemgetter    res = sorted(rows, key=itemgetter(value[,value1]))# 如果迭代项是元组或者列表,value填索引,如果迭代项是字典,value填键值。

*** : itertools模块  ---- chain(iter1, iter2, ..., iterN):创建一个新迭代器来将所有的迭代器链接起来,返回从iter1持续到iterN的迭代器  ---- chain.from_iterable(iterables): 一个备用链构造函数,其中的iterables是一个迭代变量,生成迭代序列      a = [[1, 2], [3, 4], [5, 6]]      list(itertools.chain.from_iterable(a))   #[1, 2, 3, 4, 5, 6]  ---- combinations(iterable, r):  #组合  ---- permutations(iterable [,r]):   #排列  ---- count([n]):创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算    ----cycle(iterable):创建一个迭代器,对iterable中的元素反复执行循环操作,内部会生成iterable中的元素的一个副本,此副本用于返回循环中的重复项。

  ---- tee(iterable [, n]): 从 iterable创建n个独立的迭代器,创建的迭代器以n元组的形式返回,n的默认值为2,此函数适用于任何可迭代的对象,但是,为了克隆原始迭代器,生成的项会被缓存,并在所有新创建的迭代器中使用,一定要注意,不要在调用tee()之后使用原始迭代器iterable,否则缓存机制可能无法正确工作。  ---- dropwhile(predicate, iterable):函数predicate(item)为True,就丢弃iterable中的项,如果predicate返回False,就会生成iterable中的项和所有后续项。

  ---- takewhile(predicate [, iterable]): 生成iterable中predicate(item)为True的项,只要predicate计算为False,迭代就会立即停止。  ---- starmap(func [, iterable]):生成值func(*item),其中item来自iterable,只有当iterable生成的项适用于这种调用函数的方式时,此函数才有效。      starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000  ---- repeat(object [,times]):创建一个迭代器,重复生成object,times(如果已提供)指定重复计数,如果未提供times,将无止尽返回该对象。      repeat(10, 3) --> 10 10 10  ---- product(iter1, iter2, ... iterN, [repeat=1]):生成item1,item2等中的项目的笛卡尔积的元组,repeat是一个关键字参数,指定重复生成序列的次数      product(‘ABCD‘, ‘xy‘) --> Ax Ay Bx By Cx Cy Dx Dy      product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
  ----1):ifilter:同filter  #ifilterfalse: 仅生成iterable中为False的项  ----2):izip:同zip     #izip_longest(iter1,... iterN, [fillvalue=None]):迭代过程会持续到所有输入迭代变量iter1,iter2等都耗尽为止,如果没有使用fillvalue关键字参数指定不同的值,则使用None来填充已经使用的迭代变量的值。  ----3)imap:  只要提供的一个迭代器不再生成值,迭代就会停止(例:list(imap(pow, (2,3,10), (5,2))) -->32,9)  不同map  ----4)islice

注意:{key:value for key,value in b.items()} 这种方式生成字典比dict((key, value) for key, value in b.items())慢
*** : python 聚集函数  ---- 执行聚集函数(比如 sum() , min() , max()) 一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数。
 
    



 
 
时间: 2024-10-11 10:20:22

01:数据结构和算法的相关文章

数据结构和算法学习总结01 绪论

数据结构实际上是数据元素之间的关系的集合 数据结构分为    1.逻辑结构      2.物理结构(逻辑结构的数据元素的存储方式)                            逻辑结构分为  1.集合结构   数据元素无关系,只是属于一个集合                            2.线性结构   数据元素间1对1的关系                            3.树形结构   数据元素间1对多的关系                            

[学习笔记]数据结构与算法

1.排序简单排序:?冒泡排序:将n个数从上往下排列,从第0个数开始依次对前n个.前n-1个.前n-2个数进行比较,保持小数在前大数在后,不符合就交换.在这个过程中,最后一个数始终是最大数.?选择排序:对所有n个.后n-1个.后n-2个依次比较,用一个变量存最小数,一趟比较完成之后,将最小数与所比较数据的第一个数进行交换.在这个过程中,第一个数始终是最小数.?插入排序:从第1个数开始向前扫描比较,小则插入.对于未排序数据,在已排序序列中向前扫描,并找到相应的位置插入.在这个过程中,整个序列局部有序

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

数据结构与算法20170804

本文介绍数据结构与算法的知识,相信很多人在学校都学习过,同时为了贴近实际,文章直接附上编译通过可直接使用的源码. 一.数据结构 1.线性表: 1)带头结点的链表 1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ---------------------------

数据结构与算法-排序算法-partial

前言 都什么时代了,还写排序算法的总结? 原因有二.一是别人的精彩永远是别人的,你只有鼓掌的份儿:有些事情实际动手去做了才会有所体会. 二是排序算法是一类基础类的算法,不光是IT从业者真正入门的门槛,也是一些高级算法的关键部分或算法评估的benchmark. 计划说明的算法内容有哪些?  算法的思想.Java代码实现和平均算法复杂度.算法运行完整示例. 参考文献有哪些? wiki[EB/OL] Shaffer C. A. Data Structure and Algorithm Analysis

《Java数据结构和算法》- 哈希表

Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据结构与算法(刺猬书)读书笔记----目录

最近在抓底层的语言基础,以前对数据结构和算法并没有太大感觉,但越往深处学就越觉得这些基础真的是要牢牢掌握住.一个简简单单的数组,深究起来都有很多学问.所以打算写个一系列的读书笔记,好好梳理一下这一块的基础知识.这本书是<数据结构预算法JavaScript描述>,是基于JavaScript的.里面大致介绍了数组.列表.栈.队列.链表.散列.集合及各种常见基础算法.作为基础读物算是很全面的.这系列读书笔记也将会跟着书里的顺序一章章的进行梳理.整个过程计划耗时2-3个月,每周更新一到两张,更新的笔记