如果列表可以表示为字典,其中索引是键,内容是值,那么为什么不使用字典而不是列表呢?包括如果需要建立索引,那么只需将键作为索引放在列表中即可。同时,字典比列表更快。我在谷歌上搜索了这个主题,每个人都写列表是数据的有序集合,但是字典也可以通过按照您自己的方式排序和排序来按您需要的方式进行排序,所以问题是:您可以放弃列表并仅使用字典?它们更快=>更优化+访问它们并不比使用列表更方便,如果有人知道这里的技巧是什么,请给出答案
upd:这真的只是字典没有的列表方法的问题吗?但它们都可以在字典中实现
如果列表可以表示为字典,其中索引是键,内容是值,那么为什么不使用字典而不是列表呢?包括如果需要建立索引,那么只需将键作为索引放在列表中即可。同时,字典比列表更快。我在谷歌上搜索了这个主题,每个人都写列表是数据的有序集合,但是字典也可以通过按照您自己的方式排序和排序来按您需要的方式进行排序,所以问题是:您可以放弃列表并仅使用字典?它们更快=>更优化+访问它们并不比使用列表更方便,如果有人知道这里的技巧是什么,请给出答案
upd:这真的只是字典没有的列表方法的问题吗?但它们都可以在字典中实现
为什么你认为字典更快?
要访问一个元素,字典必须计算其键的哈希值,并使用该哈希值(可能在多次跳转中)获取其位置。
在基于数组的列表中(实际上,Python 列表包含一个数组),我们只需获取指向 address 的指针即可
начало+размер_указателя*индекс。该指针指向所需的元素。 (与许多语言中的数组不同,Python列表可以包含不同的类型,因此直接将元素打包到数组中很不方便)在 PHP 中,据我了解,数组基于以索引作为键的字典。
原则上已经给出了答案,但我还是强调一些事情。
值 2、
...
哈希 2、键 2、值 2,
...
看来难度是一样的。但也有一些微妙之处。
hash密钥所以,事实证明,对于字典来说,我们有几个缺点:
因此,在我们只需要通过索引访问并快速添加到集合末尾的场景中,列表在速度和内存消耗方面显然都胜出。
因此,只有当列表的这两个主要功能对我们来说不够时,切换到字典才有意义:通过索引访问和添加到集合的末尾。那么考虑一些其他集合是有意义的,它不一定是字典。当我们频繁搜索某个键时,字典是很好的选择。他在这里没有对手。好吧,访问集合中的任意位置(如果字典是有序的,就像在更高版本的 Python 中一样)。
PS 在Python中,所有对象都是“第一类”,因此集合当然存储的不是值本身,而是对象的引用。为了便于理解,我对其进行了一些简化。对于集合的比较来说,这并不那么重要。
这个问题不是关于Python,而是关于数据结构。
有不同的字典,但我们假设字典取出一个元素的时间为 O(1),但这是一般情况+这个常量也可能不快(正如已经提到的,有哈希函数的计算)以及碰撞),此外,在最坏的情况下,这个时间变成线性 O(n)。但值得注意的是,字典是通用的,它确实可以替代很多结构,但这有必要吗?每个都有+和-。
虽然list(Python的一项功能,你可以在一个列表中存储不同类型的数据,这使得它肯定比普通动态数组慢),但即使如此它也会(通常)比map更快。
一般来说,您应该查看手头的任务并在此基础上继续努力。
首先,列表比字典更快。让我们用timeit检查一下:
检查创建字典和列表的速度:
列表的结果是0.4187秒,字典的结果是0.5405秒。如果查看创建过程中执行的指令,您会发现字典执行的指令略有不同。
对于列表:
其次,列表和字典的方法不同。例如,为了迭代字典的值,将首先执行以下指令集:
无论如何,如果任务是迭代字典,那么字典将被转换为可迭代对象,例如
dict_values.因此,对于涉及不断枚举序列的任务,最好使用列表。
主观部分
观点。如果不使用某种结构,为什么要怀疑它的存在呢?对于某些任务,有某些数据结构。它最初被设计
list为一种数据结构,您可以开箱即用,而无需编写自己的代码来实现该结构提供的功能。仅仅拥有这个就能扩展你的能力。客观部分
python让我们从数据结构的文档开始。首先,我们可以看看列表的所有方法。接下来我们发现
5.1.1 使用列表作为堆栈
5.1.2 使用列表作为队列
5.1.3.列表推导式
5.1.4.嵌套列表理解
这已经足以让人不再怀疑了。
修辞部分
如何使用字典实现n*n*n维度的矩阵?这里我们排除类型的模块
pandas并numpy替换list'a