【问题标题】:List of lists vs dictionary列表与字典列表
【发布时间】:2013-04-06 02:35:33
【问题描述】:

在 Python 中,使用列表列表与使用字典相比是否有任何优点/缺点,更具体地说是在使用它们进行数值运算时?我正在编写一类函数来解决我的线性代数类的简单矩阵运算。我用的是字典,但后来我看到numpy 使用的是列表列表,所以我想它一定有一些优势。

示例:[[1,2,3],[4,5,6],[7,8,9]] 与 {0:[1,2,3],1:[4,5,6],2:[7,8,9]} 相对

【问题讨论】:

  • 视情况而定。阅读有关哈希表如何工作的数据结构教科书。有很多不同之处使得某些用例更快,而另一些则更慢。
  • lists 将保持顺序,而 dicts 是无序的,恕我直言,矩阵相关操作列表更合适。
  • numpy 不使用列表列表:它可能以列表列表的形式显示一个二维数组,但它使用更高效且更高效的专用数组类型比列表列表更通用。
  • 它确实取决于,如果你有一个非常稀疏的矩阵,那么lists 充满Nones,dict 可能更有意义。
  • @Lattyware 直观地说,看起来即使是一个稍微稀疏的列表,中间有许多删除/插入(这需要在list 中进行大量复制),dict 可能会更好. (当然,也可能不是因为复杂性理论与实践中的性能没有直接关系。)

标签: python arrays list math dictionary


【解决方案1】:

我认为这在很大程度上取决于您计划如何使用这种结构。

Python 的字典(和大多数字典一样)默认情况下是无序的。如果你打算像这样迭代你的数据,你不应该使用字典:

for list in dict.keys():
    for elem in list:
        # Logic

同样地,使用带有键 1、2、3 ... 的字典没有多大意义,因为它们除了索引之外没有什么价值。由于散列过程,字典也占用了更多的内存空间。

如果您计划按元素访问项目(听起来很像您想要的),您仍然需要使用列表。在 O(1) 的列表中查找索引,与在字典中相同。唯一的区别是当您查找某个键值而不是索引时(这将比在字典中更快)。

只有当你有某种键值关系映射时,你才真正应该考虑使用字典,其中需要搜索有意义的键来检索相关值。这听起来不像是其中一种情况。坚持使用列表列表。


这并不是说字典是一种糟糕的数据结构。 Ruby 和 Python 向我介绍了它们,它们对于上述任何映射问题都非常有用(我发现我遇到了很多)。它们只是对特定类别的问题有用,而这不是其中之一。

【讨论】:

    【解决方案2】:

    当字典的键是0、1、...、n 时,list 会更快,因为不涉及散列。只要键不是这样的序列,就需要使用dict。

    【讨论】:

    • 我认为list是双向链表,在list中查找时间是O(n),而在dict中是O(1),所以查找比较慢在list
    • @Akavall Python 列表不是双向链表。
    • @Akavall 列表实现为动态数组,How are lists implemented?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2018-02-06
    • 2016-12-22
    • 2011-02-10
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多