列表与字典列表
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 不使用列表列表:它可能以列表列表的形式显示一个二维数组,但它使用更高效且更高效的专用数组类型比列表列表更通用。
它确实取决于,如果你有一个非常稀疏的矩阵,那么list
s 充满None
s,dict
可能更有意义。
@Lattyware 直观地说,看起来即使是一个稍微稀疏的列表,中间有许多删除/插入(这需要在list
中进行大量复制),dict
可能会更好. (当然,也可能不是因为复杂性理论与实践中的性能没有直接关系。)
【参考方案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?以上是关于列表与字典列表的主要内容,如果未能解决你的问题,请参考以下文章