首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

开源图书《Python完全自学教程》第5章

5.1.1 创建字典 在此之前,已经用引号创建了字符串、用圆括号创建了元组,用方括号创建了列表,低头看看键盘,按照此思路发展,并且排除在其他地方已经使用的符号——比如 * 等,如果选用一个用于创建字典的符号...从 type(d) 的返回值可知,Python 中以 dict 表示字典(或字典类型)。下面参照图5-1-1,理解字典的组成和要求: 字典对象用英文状态下的符号 { } 包裹。...“键”必须是不可变对象——如果书的目录名称会变化,那就不仅仅是眼花缭乱,而是手忙脚乱了。 “值”可以是 Python 中任何类型对象。 “值”可以重复。...简要说明: hash:翻译为“散列”或“哈希”,“hashable”意即“可散列”、“可哈希”。截止目前,已经学习过的 Python 内置对象中,数字、字符串、元组都是可散列的,也是不可变对象。...unhasable:翻译为“不可散列”、“不可哈希”,此前学过的列表和现在学习的字典,都是此类型的对象,同时为可变对象。 所以,字典也不能作为键值对的键。

66020

Python的可散列对象

这里先介绍Python语言中的可散列对象。 散列函数 在介绍散列表以及它在Python中的实现之前,先简要说明散列函数及其工作原理。...从文档中可知,如果两个对象相等,它们的散列值必须相等,或者说,如果两个对象已经通过==返回了True,就说明它们的散列值相等。...这是因为,自从Python3.3之后,对于字符串和字节对象,在进行散列处理之前,先增加了一个随机值,形象地说就是“加了一小撮盐”。“加盐”之后的字符串就变成了随机值。...这就意味着,用同一个类,创建了两个不同的实例对象,它们会有不同的散列值,例如: >>> class Laoqi: ......: unhashable type: 'Laoqi' 现在用所定义的类Laoqi创建了一个实例c,它就变成了不可散列的对象。

5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深度剖析Python字典和集合

    可散列的数据类型 在Python词汇表中,关于可散列类型的定义有这样一段话: “如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法。...另外可散列对象还要有__eq__()方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。” 重点是散列值不变!...散列表的键值,又称为散列值,Python中可以用hash()方法来计算所有内置类型对象的散列值。 自定义类型实际上调用的是自定义的__hash__。...,它们必须在索引空间尽量分散开来。...由此可知,不要对字典同时进行迭代和修改,循环很可能会跳过一些键,甚至是跳过那些字典中已经有的键。

    1.6K00

    Python的字典与散列表

    散列表是一种数据结构,它存储的是键值对(key-value)。 在散列表中,每个键值对的键必须是可散列的,这是因为存储的键值对通过使用其键的散列值进行索引。...一种经典的做法是通过一个可变容器存储数据和索引,并通过键的散列值建立索引,借此可以查询到特定的数据。形象地说,是创建一个大桶(bucket),里面放很多小桶。...在这个示例中,用Python创建了一个散列表,以元组为元素的列表作为输入。在初始化的时候,以输入对象的长度创建一个列表容器,然后将输入的数据存储到此容器中。...必须是可散列对象,因为字典是基于散列表而创建的。...如果键不是可散列的,Python会爆出TypeError异常。

    4.7K10

    kudu可视化工具:kudu-plus

    范围分区的键必须是主键列的一个子集 在没有散列分区的范围分区表中,每个范围分区将恰好对应于一个tablet kudu允许在运行时添加或删除范围分区,而不会影响其他分区的可用性。...在单级散列分区表中,每个桶只对应一个tablet。在表创建期间设置桶的数量。通常,主键列用作要散列的列,但与范围分区一样,可以使用主键列的任何子集。...当不需要对表进行有序访问时,散列分区是一种有效的策略。散列分区对于在tablet之间随机传播写入非常有效,这有助于缓解热点和不均匀的tablet大小。...单元格大小 在编码或压缩之前,单个单元不得大于64KB。在Kudu完成内部复合密钥编码之后,构成复合密钥的单元限制为总共16KB。插入不符合这些限制的行将导致错误返回给客户端。...主键列必须在非主键列之前 表的副本为奇数,且不能大于7,在建表时指定,且不可修改 分支说明 master为主要分支,使用kudu-client1.8.0,但我偶尔发现在某些集群的使用中产生如下错误

    38330

    ❤️爆肝新一代大数据存储宠儿,梳理了2万字 “超硬核” 文章!❤️

    kudu提供了两种分区方式:范围分区和散列分区。表可以多级分区,多级分区集合了范围分区和散列分区,或者多个散列分区 3.1 范围分区     范围分区使用全序的范围分区键对数据行进行分配。...每个分区都是根据范围分区键分配的连续段。范围分区键必须是主键的子集。 如果表只存在范围分区,不存在散列分区,则每个分区恰好对应一个tablet。     ...buckets的数量是在创建表的时候指定的。 散列分区使用的分区列是主键列,同范围分区,可以使用主键列的任意子集做分区。 散列分区是一种高效的策略,当不需要要有序的访问表的时候。...要修剪散列分区,扫描必须在每个散列列上包含等式关键字。 要修剪范围分区,扫描必须在范围分区列上包含相等或范围关键字。 多级分区表上的扫描可以独立地利用任何级别上的分区修剪。...在编码或压缩之前,单个单元不得大于64KB。

    87940

    Python 哈希(hash) 散列

    Python 中可散列的数据类型 官方定义 翻译过来就是: 如果一个对象的哈希值在其生命周期中从不变化(它需要一个 __hash__()方法) ,并且可以与其他对象进行比较(它需要一个 _ eq _ (...比较相等的 hasable 对象必须具有相同的散列值。 Hashability 使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。...为了让散列值能够胜任散列表索引这一角色,它们必须在索引空间 中尽量分散开来。这意味着在最理想的状况下,越是相似但不相等 的对象,它们散列值的差别应该越大。...dict的实现及其导致的结果 键必须是可散列的 一个可散列的对象必须满足以下要求。: 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列 值是不变的。...这意味着在一个有 1000 万个元素的字典 里,每秒能进行 200 万个键查询。 键的次序取决于添加顺序 当往 dict 里添加新键而又发生散列冲突的时候,新键可能会被安排存放到另一个位置。

    2.3K20

    漫画 | 什么是散列表(哈希表)?

    创建与输入数组相等长度的新数组,作为直接寻址表。...ASCII码转换,并相加得到这个字符串的hash,然后求模; 如果所有元素的键是对象或者组合键(对象里面的是属性类型不定),也可以通过上面的方法混合起来。...如下图所示,插入之前已经看到了两个比较长的键簇,如果待插入元素通过散列函数得到的散列值正好是这两个键簇中的第一个位置,就需要探测很多次才能找到空的位置;如果落在了两个键簇间的只有一个空位置,那就产生了更长的键簇...扩容和缩容都会创建一个新的长度M的散列表,散列函数也会因为M而改变,原来的所有元素通过新的散列函数重新散列并插入新的散列表中。...动画:动态空间处理 Java 8之前,每一个槽对应一个链表; Java 8开始之后,当哈希冲突达到一定程度时,每一个位置槽从链表转成红黑树。 面试官很客气,一直送我到门口,我依依不舍地离开这个地方。

    81611

    Redis:09---Hash对象

    一、哈希对象简介 几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组 哈希又称散列 在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1...散列在很多方面是一个微缩版的Redis,不少字符串命令都有相应的散列版本 熟悉文档数据库的读者可以将散列看作是文档数据库里面的文档,而熟悉关系数据库的读者可以将散列看作是关系数据库里面的行。...当field个数超过512,内部编码也会由ziplist变为hashtable 四、字符串和散列的比较与选择 散列的优点 散列的最大优势,只需要在数据库里面创建一个键,就可以把任意多的字段和值存储到散列里面...字符串的优点 虽然散列键命令和字符串键命令在部分功能上有重合的地方,但是字符串键命令提供的操作比散列键命令更为丰富。...,键过期时间是针对整个键的,用户无法为散列中的不同字段设置不 同的过期时间,所以当一个散列键过期的时候,他包含的所有字段和值都会被删除。

    95420

    概率数据结构:布隆过滤器

    哈希表与哈希函数 在简单数组或列表中插入新数据时,插入数据的索引不是从要插入的值确定的。这意味着密钥(索引)和值(数据)之间没有直接关系。因此,如果需要在数组中搜索值,则必须在所有索引中进行搜索。...在哈希表中,您可以通过散列值来确定键或索引。这意味着密钥是根据值确定的,每次需要检查列表中是否存在该值时,您只需对值进行散列并搜索该密钥,查找速度非常快,时间复杂度为O(1)。 ?...因此总结得到: 如果我们搜索一个值并看到该值的散列值为零,那么该值肯定不在列表中。 如果所有散列索引都是1,则搜索的值可能在列表中。 布隆过滤器操作 基本布隆过滤器支持两种操作:测试和添加。...测试用于检查给定元素是否在集合中 添加是向集合添加元素 Bloom过滤器大小和散列函数的数量 在实验中如果布隆过滤器的太小,则很快就会将所有位字段全变为1。那么布隆过滤器将有很高的“误报率”。...可以先使用布隆过滤器进行预查找,而不是查询SQL数据库以检查是否存在具有特定电子邮件的用户。如果电子邮件不存在,则不需要继续查找;如果确实存在,则可能必须对数据库进行额外查询。

    1.4K20

    系统设计:URL短链设计

    此URL的最后六个字符是我们要生成的短键。我们将在这里探讨两种解决方案: A.编码实际URL 我们可以计算给定URL的唯一散列(例如MD5或SHA256等)。然后可以对散列进行编码以显示。...如果我们使用MD5算法作为散列函数,它将生成一个128位的散列值。在base64编码之后,我们将得到一个超过21个字符的字符串(因为每个base64字符编码哈希值的6位)。...既然我们每个短键只有8个字符的空间,那么我们将如何选择我们的键呢?我们可以用前6(或8)个字母作为钥匙。但这可能会导致密钥重复,在此基础上,我们可以从编码字符串中选择一些其他字符或交换一些字符。...B基于散列的分区:在这个方案中,我们对存储的对象进行散列。然后根据散列计算要使用的分区。在我们的例子中,我们可以使用“key”或实际URL的散列来确定存储数据对象的分区。...我们的散列函数将把URL随机分配到不同的分区(例如,我们的散列函数总是可以将任何键映射到[1…256]之间的数字),这个数字将代表我们存储对象的分区。

    6.3K165

    IDOR漏洞

    在某些情况下,id值不是唯一的,如1,2,3,100,1000等,这些id值可以是编码或散列值。如果你面对编码值,则可以通过解码编码值来测试IDOR漏洞。...如果你面对散列值,则应测试散列值是可访问值还是可预测值。在另一种情况下,您可以在“Referrer”标头中访问散列值,因此这些脚本是被可以复制的。...例如,你无法访问其他用户的对象,但你可以在对象页面的源代码中找到对象的散列ID值,你可以在受害者用户的应用消息中找到对象的散列id值(这将减少bug的影响)。...例如,如果你在应用程序中更改对象的信息,你将收到包含对象信息的电子邮件。因此,如果你尝试更改另一个用户的对象信息,则无法访问HTTP响应中的任何内容,但你可以使用电子邮件访问对象的信息。...此外,为了使攻击者的工作更加困难甚至有时甚至可以防止它,您可以使用散列函数并使用散列值而不是正常数字或字符串。

    3.3K30

    数据库分区及分区优点

    从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。...(4).表分区的几种类型及操作方法 一.范围分区: 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。...当列的值没有合适的条件时,建议使用散列分区。 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。...四.组合范围散列分区 这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。...: 这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

    75440

    《学习JavaScript数据结构与算法》-- 5.字典和散列表(笔记)

    它也可以用来对数据库进行索引。 另一个很常见的应用是使用散列表来表示对象。JavaScript语言内部就是使用散列表来表示每个对象。...有时候,一些键会有相同的散列值,不同的值在散列表中对应相同位置的时候,我们称其为冲突。...经过一段时间,散列表被操作过后,我们会得到一个标记了若干删除位置的散列表。这会逐渐降低散列表的效率,因为搜索键值会随时间变得更慢。 第二种方法需要检验是否有必要将一个或多个元素移动到之前的位置。...如果移动元素是必要的,我们就需要在散列表中挪动键值对。 5.4 创建更好的散列函数 我们实现的lose lose散列函数并不是一个表现良好的散列函数,因为它会产生太多的冲突。...创建和使用这两个类主要是为了性能。WeakSet类和WeakMap类是弱化的(用对象作为键),没有强引用的键,这使得JavaScript的垃圾回收器可以从中清除整个入口。

    79600

    HashMap源码解析

    如果发生这种现象时,散列表就会用当前对象与桶中的对象进行比较(调用对象的equals方法比较),来检查当前对象是否已经在桶中存在了。如果当前对象没有在桶中存在,则会把当前对象直接存储在桶的起始位置。...如果发生了散列冲突,也就是当前桶中已经存储了元素,则底层会循环遍历这个链表找到链表中的最后一个元素,然后创建一个新节点保存数据并将最后一个元素的后继节点设置为刚刚新创建的节点。...所以我们在日常开发时,为了提高HashMap的运行效率,要尽量的必免发生散列冲突的现象。...如果我们设置的桶的数量不够存储元素时,散列表就会执行再散列。再散列的意思是说创建一个更多桶的新的散列表,然后将原散列表中的数据插入到这个新的散列表中。...在HashMap中实际上并不是在散列表中已经满了的情况下才进行再散列的,而是有一个加载因子来决定什么时候进行再散列的。在HashMap中默认的加载因子的值为0.75。

    57110

    力扣 (LeetCode)-合并两个有序数组,字典,散列表

    值和一个任意数做除法的余数 }; 实现put方法 this.put = function(key, value) { var position = loseloseHashCode(key); //根据所创建的散列函数计算出它在表中的位置...; 实现一个get方法 this.get = function (key) { // 使用所创建的散列函数来求出给定key所对应的位置 // 根据这个位置从数组table中获得这个值 return...可以使用散列集合来存储所有的英语单词 散列集合只存储唯一的不重复的值 散列集合由一个集合构成,但是插入、移除或获取元素时,使用的是散列函数 示例: // 实现print的方法 this.print...undefined) { //当某个位置上有值的时候 console.log(i + ": " + table[i]);//输出位置和对应的值 } } }; 有时候,一些键会有相同的散列值...不同的值在散列表中对应相同位置的时候,我们称其为 冲突。处理冲突有几种方法:分离链接、线性探查和双散列法 示例说明一个:分离链接 分离链接法包括为散列表的每一个位置创建一个链表并将元素存储在里面。

    1.3K30

    13.2 具体的集合

    Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。他的有些实现类能对集合中的键对象进行排序。 ?...散列码是由对象的实例域产生的一个整数,更准确的说,具有不同数据域的对象产生不同的散列码。   ...如果散列表太满,就需要再散列(rehashed)。如果要对散列表再散列,就需要创建一个桶更多的表,并将所有的元素都插入到这个表中,然后丢弃原来的表。...散列映射表对键进行散列,树映射表用键的整体顺序对元素进行排序,并将其组织成搜索树。散列或比较函数只能作用于键。与键关联的值不能进行散列或比较。...与集一样,散列稍微快一些,如果不需要按照排列顺序访问键,就最好选用散列。   每当往映射表中添加对象的时候,必须同时提供一个键。在这里,键是一个字符串,对应的值是Employee对象。

    1.8K90

    读《图解密码技术》(三):密钥、随机数和应用技术

    这种方法就是在使用共享密钥进行通信的过程中,定期改变密钥。例如,在更新密钥时,发送者和接收者使用单向散列函数计算当前密钥的散列值,并将这个散列值用作新的密钥。...加密消息 最后,使用 CEK 对消息进行加密。 而 PBE 解密的过程则如下图: 解密主要也是有三个步骤: 重建KEK 将之前保存下来的盐和口令一起输入单向散列函数,得到的散列值就是 KEK 了。...单向散列函数的算法,以及消息认证码所使用的密钥都需要与通信对象协商决定。再接下来,就是加密了。...框架的特点就是能够对其中作为组成元素的技术进行替换,就像更好零件一样。例如,消息认证码算法HMAC的设计就允许对单向散列函数的算法进行替换。...为了配送对称密码的密钥,我们需要使用公钥密码,而为了对公钥进行认证,我们又需要认证机构的公钥。以此类推,无穷无尽,我们必须在某个节点上找到一个公钥是自己能够完全信任的,也就是必须要有一个信任的种子。

    1.9K10
    领券