首页
学习
活动
专区
圈层
工具
发布

深度剖析Python字典和集合

在函数的关键字参数、实例的属性和模块的命名空间都能够看到它的身影,我们自己写代码时也经常会用到。 “集合”这个概念在Python中算是比较年轻的,使用率也比较低,我只在元素去重和求差集并集时使用过。...字典的键必须是可散列的,否则变来变去就找不到映射了。 于是可以得知原子不可变数据类型(str、bytes、和数值类型)都是可散列类型,frozenset冻结不可变集合,也是可散列的。...为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标。...不可变映射类型 借助MappingProxyType,可以实现不可变字典。它返回的是一个只读的视图,会跟随源字典动态展示,但是无法对源字典做出改动。...散列表与dict dict的键必须是可散列的: 支持hash()函数,通过__hash__()得到的散列值是不变的。 支持通过__eq__()来判断是否相等。

2.2K00

python 字典实现的原理与探析

这是一种性能的得到过高度优化的结构,通过这种时间复杂度达到O(1)的极致性能让我们在做查询的时候得到极大的便利,可问题在于,这玩意这么方便这么快,就可以滥用吗?字典里面的key是否有序?...即在python的字典中其内部使用的数据结构是哈希表 所谓哈希 哈希其实是音译的,其实就是hash,也是散列的意思,简单来说就是,通过这个散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,...构建散列函数的方法有很多,比如直接定址法、数字分析法、平方取中法、折叠法、随机数法、除留取余等。 这个话题其实也是一个大工程才能说明白,后续有机会再继续展开。...观察dict 我们先观察一个有趣的现象 [dict观察.png] 在这个案例中,作为字典的key值,要求选用不可变的容器如tuple,但如果选用可变的容器则是会弹出TypeError: unhashable...split-table dictionaries 当被创建的字典是用来保存object的__dict__属性时,该字典才会创建为一个split-table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该

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

    《流畅的Python》学习笔记之字典

    标准库里所有映射类型都是利用 dict 来实现的,它们有个共同的限制,即只有可散列的数据类型才能用做这些映射里的键。 什么是可散列的数据类型?...里只能容纳可散列类型),如果元组内都是可散列类型的话,元组也是可散列的(元组虽然是不可变类型,但如果它里面的元素是可变类型,这种元组也不能被认为是不可变的)。...那么,我们取值的时候,该如何处理找不到的键呢? 映射的弹性查询 有时候,就算某个键在映射里不存在,我们也希望在通过这个键读取值的时候能得到一个默认值。...() 方法所得的散列值不变 支持通过 __eq__() 方法检测相等性 若 a == b 为真, 则 hash(a) == hash(b) 也为真 2、字典开销巨大 因为字典使用了散列表,而散列表又必须是稀疏的...4、键的次序决定于添加顺序 当往 dict 里添加新键而又发生散列冲突时,新建可能会被安排存放在另一个位置。

    2.5K100

    散列表结构 字典与集合

    散列表结构 字典与集合 散列表 散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。...使用散列表存储数据时,通过一个散列函数将键映射为一个数字,这个数字范围是0到列表长度。散列函数的选择依赖于键的数据类型,在此我们对键的hash值对数组长度区余的方法。散列表的数组究竟应该有多大?...理想情况下,散列函数会将每个键值映射为唯一的数组索引,然而,键的数量是无限的,散列表的长度是有限的,一个理想的目标是让散列函数尽量将键均匀地映射到散列表中。...即使使用一个高效的散列函数,仍然存在将两个键映射为同一个值的可能,这种现象称为碰撞(collision)。当碰撞发生时,我们需要方案去解决。...即使两个键散列后的值相同,依然被保存在同样的位置,只不过它们在第二个数组中的位置不一样罢了。 线性探查:当发生碰撞时,线性探测法检测散列表的下一个位置是否为空。

    1.3K10

    python的字典和集合

    set的实现也依赖于散列表 常见的字典方法: 如之前所述: Container: __contains__ Iterable: __iter__ Sized: __len__ Mapping: __getitem...get items keys values MutableMapping __Setitem__ __defitem__ clear pop popitem setdefault update 只有可散列的数据类型才能做...只有实现了__hash__()和__eq__()方法的才能作为键 不可变的序列都可视为可散列的,但是 hash((1,2,3)) Out[1]: 2528502973977326415 hash((1,2...标准库中字典的变种: collections里的 OrderedDict:在添加键的时候会保持顺序,popitem是默认删除最 ChainMap:可容纳数个不同的映射对象,在进行键查找时会被作为一个整体查找...Counter:会给键准备一个计数器,用于计数键的更新次数 UesrDict:用纯python实现的dict,常用来方便用户继承 不可变映射类型,实际上可以理解为视图 MappingProxyType

    1.2K30

    Python的可散列对象

    散列函数是一种可以将任何长度的数据映射到固定长度的值的函数,这个映射过程称为散列(hash)。 散列函数具有以下三个特点: 计算速度快:计算一条数据的散列值,必须要快。...不可逆性:散列函数是一个“单向函数”,将字符串输入到散列函数,得到了散列值,但是不能反过来,不能从散列值得到原来的字符串。由于这个特性,它可以用于加密。...能够找到一些网站,能够自动生成字符串的散列值,如下图所示,是使用https://www.md5online.org提供的功能得到的。 ?...,自定义的对象,默认是可散列的,并且默认情况下,是以对象的id值作为hash()的参数。...综上可知,对象是否可散列,主要看它的__hash__是什么,如果是None,则不可散列。

    5.8K20

    Python的八种数据类型

    # 字典本质也是一个数组,但其索引是键经过散列函数处理后得到的散列值,散列函数的目的是使键均匀地分布在散列表中, # 并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。...# **添加:**Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址(这也就解释了为什么给相同的键赋值会直接覆盖的原因, # 因为相同的键转换后的地址是一样的),然后将值...**查询:**使用散列函数将key转换为数组的下标,并定位到数组对应位置获取value。 # # 字典为什么是无序的?...# 键值的哈希碰撞,hash(key1) == hash(key2)时,向字典里连续添加的这个两个键的顺序是不可以控制的,也是无法做到连续的,后来的键会按算法调整到其它位置。...# 序是不可以控制的,也是无法做到连续的,后来的键会按算法调整到其它位置。 字典空间扩容,当键的数量超过字典默认开的空间时, # 字典会做空间扩容,扩容后的键顺和创建顺序就会发生变化,不受人为控制。

    4K30

    《Python基础教程》第六章--读书

    我猜想 位置参数和位置肯定有关系,当使用它时,它会默认赋值给它位置对应的参数,那么,这里就是greeting。所以呢,这里才会赋值两次。...如何将参数收集为元祖和字典已经讨论过了,但是事实上,如果使用*和**的话也可以执行相反的操作。...可以把它们看作是值的名字。在执行x=1赋值语句后,名称x引用到值1.这就像用字典一样,键引用值,当然,变量和所对应的值用的是个“不可见”的字典。实际上这么说已经很接近真实情况了。...太痛苦了,这里的知识之前在学习JS时就已经了解的挺多,作用域链等等。还是记载以下我遗忘的知识好了。不赘述了。...我记得在JS中时,也有类似知识点,会逐步向上搜索作用域链中的变量值。 那么该怎么达成效果呢?怎么避免被屏蔽呢?使用globals函数获取全局变量值!

    1K10

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

    所谓键值对,即两个对象之间建立对应关系,并以英文冒号作为分隔符,冒号左侧的称为键( Key ),右侧的称为此键所对应的值( Value )。键与值配对,组成一个字典中的单元,称为“键值对”。...“键”必须是不可变对象——如果书的目录名称会变化,那就不仅仅是眼花缭乱,而是手忙脚乱了。 “值”可以是 Python 中任何类型对象。 “值”可以重复。...简要说明: hash:翻译为“散列”或“哈希”,“hashable”意即“可散列”、“可哈希”。截止目前,已经学习过的 Python 内置对象中,数字、字符串、元组都是可散列的,也是不可变对象。...unhasable:翻译为“不可散列”、“不可哈希”,此前学过的列表和现在学习的字典,都是此类型的对象,同时为可变对象。 所以,字典也不能作为键值对的键。...: unhashable type: 'dict' 特别提醒,如果用元组作为键值对的键,其成员只能是数字、字符串或者元组,不能包括任何可变对象。

    1.1K20

    Redis中存储亿级键值对

    我们最近不得不这样做:在Instagram上,于遗留原因,我们需要将大约3亿张照片映射到创建它们的用户的ID,以便了解要查询的分片(请参阅有关我们的更多信息)分片设置)。...但是,考虑到这些ID从未更新(仅插入),SQL数据库似乎是多余的。不需要事务,也和其他表没有任何关系。 相反,我们转向Redis,一个我们在Instagram上广泛使用的键值存储。...Redis中的哈希是字典,可以非常有效地编码在内存中; Redis设置'hash-zipmap-max-entries'配置散列可以有效编码的最大条目数。...为了用散列类型,我们将所有媒体ID分配到1000个桶中(我们只取ID,除以1000并丢弃剩余部分)。这决定了属于哪个键,接下来在该键的散列中,Media ID是散列中的查找键,用户ID是值。...扩展到3亿个key,总数不到5GB,事实上,它甚至适合亚马逊上更便宜的m1.large实例类型,大约是我们原本需要的更大实例成本的1/3。最重要的是,散列中的查找仍然是O(1),非常快。

    2K30

    tf.Session

    fetches: 单个图形元素、一组图形元素或一个字典,其值是图形元素或图形元素列表(请参阅运行文档)。feed_dict:将图形元素映射到值的字典(如上所述)。...返回值:如果fetches是单个图形元素,则使用单个值;如果fetches是列表,则使用值列表;如果fetches是字典,则使用与之相同的键的字典(有关运行,请参阅文档)。...如果键是张量或稀疏张量的嵌套元组,则该值应该是嵌套元组,其结构与上面映射到其对应值的结构相同。feed_dict中的每个值必须转换为对应键的dtype的numpy数组。...例如,当用户打开跟踪选项时,所分析的信息将被收集到这个参数中并传递回去。参数:fetches:单个图元素、图元素列表或字典,其值是图元素或图元素列表(如上所述)。...fetches是字典,则使用与之相同的键的字典(如上所述)。

    3.5K20

    BI技巧丨权限下载

    图片BOSS:白茶,问你个事,就是报表的下载权限,这个能控制不?白茶:可以啊,老板,工作区限制成员身份就可以啊。BOSS:不是,我说的不是这个,是可视化图表明细数据下载功能!...可以根据用户的权限,决定用户是否具有明细数据的下载权限,我们以销售明细表作为本次下载控制的示例。用户权限,我们可以通过Excel中Access权限表维护进行配置,那么下载该如何操作呢?...图片图片这样,我们就实现了两个可视化明细页面,一张可以下载数据,一张不可以下载。将其发布到Server上面,我们来查看一下效果。...,当用户级别为1的时候,不可以下载,当用户级别为2的时候,可以下载。...小伙伴在使用的过程中,可以根据自己的需求设定。设置跳转按钮:插入一个可以跳转的按钮,将操作设置打开,选择页导航,选择我们上面写好的度量值。图片图片图片图片Demo文件在语雀。

    82150

    Extreme DAX-第3章 DAX 的用法

    计算列的一些问题同样也适用于计算表:计算表会增加 Power BI 模型的大小,并且你可能正在执行一些实际上是数据准备层面的工作。但是,与计算列相反,计算表不会与模型的其他元素紧密耦合。...建议以模型中的最小年份作为日期表的开端,并以最大年份结束[2]。日期表必须具有日期列,该列是日期表的唯一键(您也可以自己设置此列的名称)。表中的其他列是每天的属性,如年、月、季度、工作日等。...3.7.1 首先考虑使用 DAX 度量值 如果在上文中没有足够地表达清楚,那么容我再重复一边:您的主要 DAX 工具应该是度量值。...对于你们所有人来说,最好隐藏模型中会遮盖有用表、列和度量值的元素。 关系中的外键列应当隐藏:主键上相同的值,并且会正确地筛选关系的另一端。 不在报告中展示的技术(键)列应当隐藏。...1 译者注:0作为除数时,如果使用“/”,得到的结果是“∞”,而使用DIVIDE函数会显示空白。

    9.1K20

    快速掌握Series~创建Series

    一般格式 (这里的data就是value值的集合): s = pd.Series( data , index ) data几种常见的取值类型: 标量值、list列表; ndarray对象; dict字典...; index取值规范: 索引值必须是可hashable的(如果一个对象是可散列的,那么在这个对象的生命周期中,他的散列值是不会变的(它需要实现__hash__()方法)),并且索引index的长度必须和...1 c 2 dtype: int64 这里由于将data位置的参数传入字典,将字典的键作为了Series对象的index,所以如果再次指定index的时候会出现一些新的情况: 指定的index中不包含字典中的键值...我们使用Python字典作为创建Series的data,同时我们知道当将字典作为创建Series对象的data的话,Python字典中的key可以作为Series的index,但是此时我们仍然可以继续指定...由于Python中字典中的key不能够重复,所以虽然Series允许使用有重复的index值,但是如果使用字典创建Series的时候肯定不会有相同的index值。

    1.6K20

    Python 哈希(hash) 散列

    标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列的数据类型才能用作这些映射里的键,本文记录Python 中 hash 相关内容。...这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。...比较相等的 hasable 对象必须具有相同的散列值。 Hashability 使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。...dict的实现及其导致的结果 键必须是可散列的 一个可散列的对象必须满足以下要求。: 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列 值是不变的。...字典在内存上的开销巨大 由于字典使用了散列表,而散列表又必须是稀疏的,这导致它在空 间上的效率低下。

    3.2K20

    由一个简单的Python合并字典问题引发的思考,如何优化我们的代码?

    ,并且想要将它们合并为新字典而不更改原始字典: x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} 理想的结果是获得一个z是合并后的新字典,第二个Dict的值覆盖第一个字典...类似地,当值是不可散列的对象(例如列表)时,items()在Python 3(viewitems()在Python 2.7中)进行联合也将失败。...所以不要这样做: >>> c = dict(a.items() | b.items()) 我们演示一下值不可散列时会发生的情况: >>> x = {'a': []} >>> y = {'b': []}...由于这种情况的存在,我们看看在django中修复的用法示例。 字典旨在获取可散列的键(例如,frozenset或tuple),但是当键不是字符串时,此方法在Python 3中失败。...': 11} 在这个地方使用**运算符也不会滥用该机制,我们使用**正是为了将dict作为关键字传递而设计的。

    1.8K10

    Python的字典与散列表

    散列表是一种数据结构,它存储的是键值对(key-value)。 在散列表中,每个键值对的键必须是可散列的,这是因为存储的键值对通过使用其键的散列值进行索引。...一种经典的做法是通过一个可变容器存储数据和索引,并通过键的散列值建立索引,借此可以查询到特定的数据。形象地说,是创建一个大桶(bucket),里面放很多小桶。...循环语句,在第11行,计算每个可散列元素的键的散列值,用它计算一个索引值(第12行),将此索引值作为self.buckets容器(bucket,也有直接译为“桶”)的索引(第13行),并向该索引对应的数据结构...,必须是可散列对象,因为字典是基于散列表而创建的。...如果键不是可散列的,Python会爆出TypeError异常。

    5.6K10

    详解Python中的可哈希对象与不可哈希对象(二)

    作者:草yang年华 前言:我们经常会听见很多的概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多的概念后面到底又有什么区别和联系,它们的本质又是怎么样的,本此系列文章将针对这些概念进行说明...__eq__():用于比较两个对象是否相等 __cmp__():用于比较两个对象的大小关系,它与__eq__只要有一个就可以了 __hash__():实际上就是哈希函数(散列函数),返回经过运算得到的哈希值...与 B-树相比,这在大多数情况下为查找(目前最常见的操作)提供了更好的性能,并且实现更简单。 字典的工作方式是使用 hash() 内置函数计算字典中存储的每个键的 hash 代码。...3.2 字典 key 必须是不可变的(可哈希hashable) 字典的哈希表实现使用从键值计算的哈希值来查找键。 (1)为什么可变对象不能作为键Key?...id是一样的,id一样也导致了根据id计算得到的哈希值是一样的,哈希值一样我自然可以搜索得到那个100在哪个地方了。

    11.7K63

    Extreme DAX-第5章 基于DAX的安全性

    不过,你通常不会在整个模型中使用电子邮件地址作为用户 ID,而是使用数字(HR 系统中的员工编号或生成的密钥)。无论哪种方式,你都需要一个单独的表,其中包含电子邮件地址和用户ID之间的映射。...5.2.2 介绍 PATH 函数 如果我们设计一张表,表中对于父子层次结构重新编排,则可以得到一张包含所有信息的表。在我们的示例中,指的是从员工到经理,再到经理的经理,一直到层次结构的顶部。...因此安全筛选器的结果是,用户下层次结构中的所有员工都可见,而其他员工是不可见的。 5.2.4 RLS 中的高级层次结构导航 通过巧妙地使用PATH函数,你可以实现各种高级安全规则。...但这对我们没有帮助,它肯定不会为私有列提供空白值;相反,它把我们重新回到只有一张表的情况。 解决方案是向私有表中添加行。...在设计模型时,应始终考虑自助服务用户可能的需求,用户将能够针对模型编写自己的度量值。这样,你不必在度量值安全上面再花费功夫。 相反,安全性必须仅依赖于模型结构和 RLS。

    6.5K30

    SHA-256、MD-5…… 哈希散列函数这些原理你懂了吗?

    这一点非常重要,因为这意味着,作为一名网站开发人员,我只需存储用户密码的哈希散列(加扰数据),即可对其进行验证。 当用户进行注册时,我对密码进行哈希散列处理,并将其存储在数据库中。...当用户登录时,我只需再次对输入的内容进行哈希散列处理,并比较两个哈希值。由于特定的输入始终会输出相同的哈希值,所以该方法每次都可以成功验证密码。...这是其另一个重要特性,因为这可以节省我们的计算时间。典型的例子是在数据映射(data map)中使用哈希散列作为键(key)。数据映射是计算机科学中用来存储数据的简单结构。...如果想将书籍存储在数据映射中,则可以对书籍的内容进行哈希散列处理,并使用哈希值作为键。作为一名程序员,我可以轻而易举地使用哈希散列来查找该书的内容,而不必按标题、作者等对数千条记录进行排序。...其工作原理是怎样的呢? 这部分是本文的难点,我会尽量将其简化,省略实际的实现细节,重点介绍计算机在使用哈希散列处理数据时工作原理的基本概念。

    1.2K10
    领券