首页 文章 精选 留言 我的

精选列表

搜索[数据结构],共7263篇文章
优秀的个人博客,低调大师

python 数据结构 set

创建set tuple算是list和str的杂合,那么set则可以堪称是list和dict的杂合. set拥有类似dict的特点:可以用{}花括号来定义;其中的元素没有序列,也就是是非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键. set也有继承了一点list的特点:如可以原处修改(事实上是一种类别的set可以原处修改,另外一种不可以). 实验: >>> s1 = set("hiekaye") #把str中的字符拆解开,形成set.特别注意观察:hiekay3中有两个e >>> s1 #但是在s1中,只有一个i,也就是不能重复 set(['h', 'i', '3', 'k', 'a','y']) >>> s2 = set([123,"google","face","book","facebook","book"]) #通过list创建set.不能有重复,元素可以是int/str >>> s2 set(['facebook', 123, 'google', 'book', 'face']) #元素顺序排列不是按照指定顺序 >>> s3 = {"facebook",123} #通过{}直接创建 >>> s3 set([123, 'facebook']) 探究: >>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict' >>> s3 = {"facebook",[1,2],123} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' 从上述实验中,可以看出,通过{}无法创建含有list/dict元素的set. 继续探索: >>> s1 set(['q', 'i', 's', 'r', 'w']) >>> s1[1] = "I" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'set' object does not support item assignment >>> s1 set(['q', 'i', 's', 'r', 'w']) >>> lst = list(s1) >>> lst ['q', 'i', 's', 'r', 'w'] >>> lst[1] = "I" >>> lst ['q', 'I', 's', 'r', 'w'] 上面的探索中,将set和list做了一个对比,虽然说两者都能够做原处修改,但是,通过索引编号(偏移量)的方式,直接修改,list允许,但是set报错. 那么,set如何修改呢? 更改set 把set的有关内置函数找出来. >>> dir(set) ['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'] 先看这些: 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update' 然后用help()可以找到每个函数的具体使用方法,下面列几个例子: 增加元素 >>> help(set.add) Help on method_descriptor: add(...) Add an element to a set. This has no effect if the element is already present. 实验: >>> a_set = {} #我想当然地认为这样也可以建立一个set >>> a_set.add("hiekay") #报错.看看错误信息,居然告诉我dict没有add.我分明建立的是set呀. Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'add' >>> type(a_set) #type之后发现,计算机认为我建立的是一个dict <type 'dict'> 特别说明一下,{}这个东西,在dict和set中都用.但是,如上面的方法建立的是dict,不是set.这是python规定的.要建立set,只能用前面介绍的方法了. >>> a_set = {'a','i'} #这回就是set了吧 >>> type(a_set) <type 'set'> #果然 >>> a_set.add("hiekay") #增加一个元素 >>> a_set #原处修改,即原来的a_set引用对象已经改变 set(['i', 'a', 'hiekay']) >>> b_set = set("python") >>> type(b_set) <type 'set'> >>> b_set set(['h', 'o', 'n', 'p', 't', 'y']) >>> b_set.add("hiekay") >>> b_set set(['h', 'o', 'n', 'p', 't', 'hiekay', 'y']) >>> b_set.add([1,2,3]) #这样做是不行滴,跟前面一样,报错. Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> b_set.add('[1,2,3]') #可以这样! >>> b_set set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'hiekay', 'y']) 从另外一个set中合并过来元素,方法是set.update(s2) >>> help(set.update) update(...) Update a set with the union of itself and others. >>> s1 set(['a', 'b']) >>> s2 set(['github', 'hiekay']) >>> s1.update(s2) #把s2的元素并入到s1中. >>> s1 #s1的引用对象修改 set(['a', 'hiekay', 'b', 'github']) >>> s2 #s2的未变 set(['github', 'hiekay']) 删除 >>> help(set.pop) pop(...) Remove and return an arbitrary set element. Raises KeyError if the set is empty. >>> b_set set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'hiekay', 'y']) >>> b_set.pop() #从set中任意选一个删除,并返回该值 '[1,2,3]' >>> b_set.pop() 'h' >>> b_set.pop() 'o' >>> b_set set(['n', 'p', 't', 'hiekay', 'y']) >>> b_set.pop("n") #如果要指定删除某个元素,报错了. Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: pop() takes no arguments (1 given) set.pop()是从set中任意选一个元素,删除并将这个值返回.但是,不能指定删除某个元素.报错信息中就告诉我们了,pop()不能有参数.此外,如果set是空的了,也报错.这条是帮助信息告诉我们的. 要删除指定的元素,怎么办? >>> help(set.remove) remove(...) Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError. set.remove(obj)中的obj,必须是set中的元素,否则就报错.试一试: >>> a_set set(['i', 'a', 'hiekay']) >>> a_set.remove("i") >>> a_set set(['a', 'hiekay']) >>> a_set.remove("w") Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'w' discard(obj): >>> help(set.discard) discard(...) Remove an element from a set if it is a member. If the element is not a member, do nothing. 与help(set.remove)的信息对比,看看有什么不同.discard(obj)中的obj如果是set中的元素,就删除,如果不是,就什么也不做,do nothing. >>> a_set.discard('a') >>> a_set set(['hiekay']) >>> a_set.discard('b') >>> set.clear(),它的功能是:Remove all elements from this set. >>> a_set set(['hiekay']) >>> a_set.clear() >>> a_set set([]) >>> bool(a_set) #空了,bool一下返回False. False

优秀的个人博客,低调大师

python 数据结构 字典

字典,名称就叫做dictionary,翻译过来是字典,类似于前面的int/str/list,这种类型数据名称是:dict 实验: >>>help(dict) 使用dir,也能得到相同的结果。 >>> dir(dict) ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues'] values这个内置函数的使用方法 >>> help(dict.values) Help on method_descriptor: values(...) D.values() -> list of D's values (END) q键退回。 概述 python中的dict具有如下特点: dict是可变的 dict可以存储任意数量的Python对象 dict可以存储任何python数据类型 dict以:key:value,即“键:值”对的形式存储数据,每个键是唯一的。 dict也被称为关联数组或哈希表。 以上诸条,如果还不是很理解,也没有关系,通过下面的学习,特别是通过各种实验,就能理解了。 创建dict 方法1: 创建一个空的dict,这个空dict,可以在以后向里面加东西用。 >>> mydict = {} >>> mydict {} 创建有内容的dict。 >>> person = {"name":"hiekay","site":"hiekay.github.io","language":"python"} >>> person {'name': 'hiekay', 'language': 'python', 'site': 'hiekay.github.io'} "name":"hiekay"就是一个键值对,前面的name叫做键(key),后面的hiekay是前面的键所对应的值(value)。在一个dict中,键是唯一的,不能重复;值则是对应于键,值可以重复。键值之间用(:)英文的分号,每一对键值之间用英文的逗号(,)隔开。 >>> person['name2']="hiekay" #这是一种向dict中增加键值对的方法 >>> person {'name2': 'hiekay', 'name': 'hiekay', 'language': 'python', 'site': 'hiekay.github.io'} 如下,演示了从一个空的dict开始增加内容的过程: >>> mydict = {} >>> mydict {} >>> mydict["site"] = "hiekay.github.io" >>> mydict[1] = 80 >>> mydict[2] = "python" >>> mydict["name"] = ["zhangsan","lisi","wangwu"] >>> mydict {1: 80, 2: 'python', 'site': 'hiekay.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']} >>> mydict[1] = 90 #如果这样,则是修改这个键的值 >>> mydict {1: 90, 2: 'python', 'site': 'hiekay.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']} 方法2: 元组 >>> name = (["first","Google"],["second","Yahoo"]) #这是另外一种数据类型,称之为元组,后面会讲到 >>> website = dict(name) >>> website {'second': 'Yahoo', 'first': 'Google'} 方法3: Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。 >>> website = {}.fromkeys(("third","forth"),"facebook") >>> website {'forth': 'facebook', 'third': 'facebook'} 需要提醒的是,这种方法是从新建立一个dict。 访问dict的值 因为dict是以键值对的形式存储数据的,所以,只要知道键,就能得到值。这本质上就是一种映射关系。 >>> person {'name2': 'hiekay', 'name': 'hiekay', 'language': 'python', 'site': 'hiekay.github.io'} >>> person['name'] 'hiekay' >>> person['language'] 'python' >>> site = person['site'] >>> print site hiekay.github.io 遍历: 可以用for语句 >>> person {'name2': 'hiekay', 'name': 'hiekay', 'language': 'python', 'site': 'hiekay.github.io'} >>> for key in person: ... print person[key] ... hiekay hiekay python hiekay.github.io

优秀的个人博客,低调大师

python 数据结构 元组 tuple

tuple使用场景 Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。 如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。 Tuples 可以在 dictionary 中被用做 key,但是 list 不行。实际上,事情要比这更复杂。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。 Tuples 可以用在字符串格式化中,后面会用到。 字符串 >>>#变量引用str >>> s = "abc" >>> s 'abc' 元组 >>>#如果这样写,就会是... >>> t = 123,'abc',["come","here"] >>> t (123, 'abc', ['come', 'here']) 上面例子中看到的变量t,并没有报错,也没有“最后一个有效”,而是将对象做为一个新的数据类型:tuple(元组),赋值给了变量t。 元组是用圆括号括起来的,其中的元素之间用逗号隔开。(都是英文半角) tuple是一种序列类型的数据,这点上跟list/str类似。它的特点就是其中的元素不能更改,这点上跟list不同,倒是跟str类似;它的元素又可以是任何类型的数据,这点上跟list相同,但不同于str。 >>> t = 1,"23",[123,"abc"],("python","learn") #元素多样性,近list >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> t[0] = 8 #不能原地修改,近str Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t.append("no") Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append' >>> 从上面的简单比较似乎可以认为,tuple就是一个融合了部分list和部分str属性的杂交产物。此言有理。 像list那样访问元素和切片 先复习list中的一点知识: >>> one_list = ["python","hiekay","github","io"] >>> one_list[2] 'github' >>> one_list[1:] ['hiekay', 'github', 'io'] >>> for word in one_list: ... print word ... python hiekay github io >>> len(one_list) 4 上面的list如果换成tuple是否可行 >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> t[2] [123, 'abc'] >>> t[1:] ('23', [123, 'abc'], ('python', 'learn')) >>> for every in t: ... print every ... 1 23 [123, 'abc'] ('python', 'learn') >>> len(t) 4 >>> t[2][0] #还能这样呀,哦对了,list中也能这样 123 >>> t[3][1] 'learn' 所有在list中可以修改list的方法,在tuple中,都失效。 分别用list()和tuple()能够实现两者的转化: >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> tls = list(t) #tuple-->list >>> tls [1, '23', [123, 'abc'], ('python', 'learn')] >>> t_tuple = tuple(tls) #list-->tuple >>> t_tuple (1, '23', [123, 'abc'], ('python', 'learn')) ``` XX

优秀的个人博客,低调大师

python 数据结构 list(3)

list解析 先看下面的例子,这个例子是想得到1到9的每个整数的平方,并且将结果放在list中打印出来 >>> power2 = [] >>> for i in range(1,10): ... power2.append(i*i) ... >>> power2 [1, 4, 9, 16, 25, 36, 49, 64, 81] python有一个非常有意思的功能,就是list解析,就是这样的: >>> squares = [x**2 for x in range(1,10)] >>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81] 找出100以内的能够被3整除的正整数。 我们用的方法是: aliquot = [] for n in range(1,100): if n%3 == 0: aliquot.append(n) print aliquot 用list解析重写,会是这样的: >>> aliquot = [n for n in range(1,100) if n%3==0] >>> aliquot [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 另一个: >>> print range(3,100,3) [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 其实,不仅仅对数字组成的list,所有的都可以如此操作。 >>> mybag = [' glass',' apple','green leaf '] #有的前面有空格,有的后面有空格 >>> [one.strip() for one in mybag] #去掉元素前后的空格 ['glass', 'apple', 'green leaf'] enumerate 这是一个有意思的内置函数,本来我们可以通过for i in range(len(list))的方式得到一个list的每个元素编号,然后在用list[i]的方式得到该元素。如果要同时得到元素编号和元素怎么办?就是这样了: >>> for i in range(len(week)): ... print week[i]+' is '+str(i) #注意,i是int类型,如果和前面的用+连接,必须是str类型 ... monday is 0 sunday is 1 friday is 2 python中提供了一个内置函数enumerate,能够实现类似的功能 >>> for (i,day) in enumerate(week): ... print day+' is '+str(i) ... monday is 0 sunday is 1 friday is 2 实验: >>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] >>> list(enumerate(seasons, start=1)) [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] 在这里有类似(0,'Spring')这样的东西,这是另外一种数据类型,待后面详解。 下面将enumerate函数和list解析联合起来,同时显示,在进行list解析的时候,也可以包含进函数 >>> def treatment(pos, element): ... return "%d: %s"%(pos,element) ... >>> seq = ["hiekay","hiekay.github.io","python"] >>> [ treatment(i, ele) for i,ele in enumerate(seq) ] ['0: hiekay', '1: hiekay.github.io', '2: python'] 函数lambda: 例如: g = lambda x:x+1 ambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为: def g(x): return x+1 >>> seq = ["hiekay","hiekay.github.io","python"] >>> foo = lambda i,ele:"%d:%s"%(i,ele) #lambda函数,给代码带来了简介 >>> [foo(i,ele) for i,ele in enumerate(seq)] ['0:hiekay', '1:hiekay.github.io', '2:python']

优秀的个人博客,低调大师

数据结构---树(待补充)

基本概念 1. 相关定义 树是由n(n>0)个有限节点组成一个具有层次关系的集合。 每个节点有零个或多个子节点。 没有父节点的节点称为根节点。 每一个非根节点有且只有一个父节点。 除了根节点外,每个子节点可以分为多个不相交的子树。 节点的度:一个节点含有的子树的个数称为该节点的度。 树的度:一棵树中,最大的节点的度称为树的度。 叶节点或终端节点:度为零的节点。 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0。 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0。 森林:由m(m>=0)棵互不相交的树的集合称为森林。 2. 树的分类 无序树 树中任意节点的子节点之间没有顺序关系。它就是一个无回路的连通图,没有确定根,在自由树中选定一顶点做根,则成为一棵通常的树。 有序树 树中任意节点的子节点之间有顺序关系。常见的有序树有:二叉树、完全二叉树、满二叉树、平衡二叉树(AVL树)、二叉查找树、霍夫曼树、B树、字典树。 3. 相关规律 二叉树 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。 在二叉树的第 i 层上至多有$2^{i-1}$个结点(i≥1)。 深度为k的二叉树至多有$2^k-1$个结点(k≥1)。 对任何一棵二叉树,如果其叶子节点数为$n_0$,度为2的结点数为$n_2$,则$n_0=n_2 + 1$。(要会推导) 完全二叉树&&满二叉树 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列。 满二叉树:每一个层的结点数都达到最大值。 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。 具有n个结点的完全二叉树的深度为$log_2n + 1$ 平衡二叉树 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 最小二叉平衡树的节点的公式:$F(n)=F(n-1)+F(n-2)+1$ 二叉查找树 二叉查找树又叫二叉排序树或二叉搜索树。是一棵空树,或者是具有下列性质的二叉树: 1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; 3. 左、右子树也分别为二叉排序树; 4. 没有键值相等的节点。 二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。 霍夫曼树 带权路径最短的二叉树。是一个一般化的二叉查找树,可以拥有多于2个子节点。 B树 不是二叉树,是一个一般化的二叉查找树,可以拥有多于2个子节点。 ![image](https://yqfile.alicdn.com/da7677793d755574cf60be202909743405eb894b.png) 字典树 Tire树称为字典树,又称单词查找树,Trie树用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 Tire树的三个基本性质: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符; 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 3. 每个节点的所有子节点包含的字符都不相同。 相关实现(C++)

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册