RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1600542
Accepted
facecaat
facecaat
Asked:2024-11-22 20:05:30 +0000 UTC2024-11-22 20:05:30 +0000 UTC 2024-11-22 20:05:30 +0000 UTC

如果你有字典,为什么还需要列表?

  • 772

如果列表可以表示为字典,其中索引是键,内容是值,那么为什么不使用字典而不是列表呢?包括如果需要建立索引,那么只需将键作为索引放在列表中即可。同时,字典比列表更快。我在谷歌上搜索了这个主题,每个人都写列表是数据的有序集合,但是字典也可以通过按照您自己的方式排序和排序来按您需要的方式进行排序,所以问题是:您可以放弃列表并仅使用字典?它们更快=>更优化+访问它们并不比使用列表更方便,如果有人知道这里的技巧是什么,请给出答案

upd:这真的只是字典没有的列表方法的问题吗?但它们都可以在字典中实现

python
  • 5 5 个回答
  • 64 Views

5 个回答

  • Voted
  1. Best Answer
    MBo
    2024-11-22T20:17:34Z2024-11-22T20:17:34Z

    为什么你认为字典更快?

    要访问一个元素,字典必须计算其键的哈希值,并使用该哈希值(可能在多次跳转中)获取其位置。

    在基于数组的列表中(实际上,Python 列表包含一个数组),我们只需获取指向 address 的指针即可начало+размер_указателя*индекс。该指针指向所需的元素。 (与许多语言中的数组不同,Python列表可以包含不同的类型,因此直接将元素打包到数组中很不方便)

    在 PHP 中,据我了解,数组基于以索引作为键的字典。

    • 3
  2. CrazyElf
    2024-11-22T21:30:00Z2024-11-22T21:30:00Z

    原则上已经给出了答案,但我还是强调一些事情。

    收藏类型 通过索引/键访问 添加到最后 我们储存什么
    字典 O(1)* O(1)* 值 1、
    值 2、
    ...
    列表 复杂度(1) O(1)** 哈希 1、键 1、值 1、
    哈希 2、键 2、值 2,
    ...

    看来难度是一样的。但也有一些微妙之处。

    附加操作 最坏的情况
    * 需要计算hash密钥 如果可能发生碰撞,则比较对象本身;如果有很多冲突,那么你需要增加表的大小
    ** 如果数组已满,则需要增加数组的大小

    所以,事实证明,对于字典来说,我们有几个缺点:

    • 每次都需要获取对象的哈希值
    • 需要比较对象本身来解决冲突
    • 除了对象本身之外,还需要存储密钥及其哈希值

    因此,在我们只需要通过索引访问并快速添加到集合末尾的场景中,列表在速度和内存消耗方面显然都胜出。

    因此,只有当列表的这两个主要功能对我们来说不够时,切换到字典才有意义:通过索引访问和添加到集合的末尾。那么考虑一些其他集合是有意义的,它不一定是字典。当我们频繁搜索某个键时,字典是很好的选择。他在这里没有对手。好吧,访问集合中的任意位置(如果字典是有序的,就像在更高版本的 Python 中一样)。

    PS 在Python中,所有对象都是“第一类”,因此集合当然存储的不是值本身,而是对象的引用。为了便于理解,我对其进行了一些简化。对于集合的比较来说,这并不那么重要。

    • 2
  3. Den
    2024-11-22T20:36:00Z2024-11-22T20:36:00Z

    这个问题不是关于Python,而是关于数据结构。

    有不同的字典,但我们假设字典取出一个元素的时间为 O(1),但这是一般情况+这个常量也可能不快(正如已经提到的,有哈希函数的计算)以及碰撞),此外,在最坏的情况下,这个时间变成线性 O(n)。但值得注意的是,字典是通用的,它确实可以替代很多结构,但这有必要吗?每个都有+和-。

    虽然list(Python的一项功能,你可以在一个列表中存储不同类型的数据,这使得它肯定比普通动态数组慢),但即使如此它也会(通常)比map更快。

    一般来说,您应该查看手头的任务并在此基础上继续努力。

    • 1
  4. Ben Puls
    2024-11-22T20:48:55Z2024-11-22T20:48:55Z

    首先,列表比字典更快。让我们用timeit检查一下:

    检查创建字典和列表的速度:

    def test_list():
        ["foo"]
    
    def test_dict():
        {0: "foo"}
    
    timeit.timeit(test_list, number=10000000), timeit.timeit(test_dict, number=10000000)
    

    列表的结果是0.4187秒,字典的结果是0.5405秒。如果查看创建过程中执行的指令,您会发现字典执行的指令略有不同。

      7           0 RESUME                   0
    
      8           2 LOAD_CONST               1 (0)
                  4 LOAD_CONST               2 ('foo')
                  6 BUILD_MAP                1
                  8 POP_TOP
                 10 RETURN_CONST             0 (None)
    

    对于列表:

      4           0 RESUME                   0
    
      5           2 LOAD_CONST               1 ('foo')
                  4 BUILD_LIST               1
                  6 POP_TOP
                  8 RETURN_CONST             0 (None)
    

    其次,列表和字典的方法不同。例如,为了迭代字典的值,将首先执行以下指令集:

                  8 LOAD_ATTR                1 (NULL|self + values)
                 28 CALL                     0
    

    无论如何,如果任务是迭代字典,那么字典将被转换为可迭代对象,例如dict_values.

    因此,对于涉及不断枚举序列的任务,最好使用列表。

    • 0
  5. Dmitry
    2024-11-22T20:57:54Z2024-11-22T20:57:54Z

    主观部分

    观点。如果不使用某种结构,为什么要怀疑它的存在呢?对于某些任务,有某些数据结构。它最初被设计list为一种数据结构,您可以开箱即用,而无需编写自己的代码来实现该结构提供的功能。仅仅拥有这个就能扩展你的能力。

    客观部分

    python 让我们从数据结构的文档开始。

    首先,我们可以看看列表的所有方法。接下来我们发现

    5.1.1 使用列表作为堆栈

    5.1.2 使用列表作为队列

    5.1.3.列表推导式

    5.1.4.嵌套列表理解

    这已经足以让人不再怀疑了。

    修辞部分

    如何使用字典实现n*n*n维度的矩阵?这里我们排除类型的模块pandas并numpy替换list'a

    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5