列表与字典列表

Posted

技术标签:

【中文标题】列表与字典列表【英文标题】: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 可能会更好. (当然,也可能不是因为复杂性理论与实践中的性能没有直接关系。) 【参考方案1】:

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

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

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

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

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

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


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

【讨论】:

【参考方案2】:

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

【讨论】:

我认为list是双向链表,在list中查找时间是O(n),而在dict中是O(1),所以查找比较慢在list @Akavall Python 列表不是双向链表。 @Akavall 列表实现为动态数组,How are lists implemented?

以上是关于列表与字典列表的主要内容,如果未能解决你的问题,请参考以下文章

python 字典列表字符串 之间的转换

Python列表集合与字典

Python 字符串/列表/元组/字典之间的相互转换

字典:散列表散列字典关键字列表集合与结构体

列表元组字典与集合

列表和字典有啥区别?