2013-06-30 37 views
6

我喜欢使用collections.OrderedDict有时当我需要一个关联数组,其中应保留键的顺序。我对此的最好例子是解析或创建csv文件,其中将列的顺序隐式保留在对象中非常有用。使用collections.OrderedDict是不好的做法吗?

但是我担心这是不好的做法,因为在我看来,关联数组的整个概念是键的顺序应该是从来没有问题,并且任何依赖于排序的操作应该只是使用列表,因为这就是列表存在的原因(这可以在上面的csv示例中完成)。我没有这方面的数据,但我敢打赌,列表的性能普遍比OrderedDict好。

所以我的问题是:OrderedDict是否有真正引人注目的用例? csv用例是应该使用还是不好的例子?

回答

2

对于您的特定用例(编写csv文件),不需要命令字典。相反,使用DictWriter

我个人使用OrderedDict当我需要一些LIFO/FIFO访问,其中甚至有一个popitem方法。老实说,我想不出一个良好的使用情况,但对于PEP-0327属性序中提到的一个是一个很好的一个:

XML/HTML处理库目前下降的 属性排序,用列表,而不是一个字典,使得过滤 繁琐,或实现自己的有序字典。这影响到 ElementTree,html5lib,Genshi和更多的库。

如果您有问题为什么Python中有某些功能,PEP是一个很好的起点,因为这是导致包含该功能的理由的详细地方。

-1

对于CSV和重复键的类似结构使用namedtuple。这是两全其美的。

0

大概评论就足够了......

我觉得这是有问题的,如果你使用它的地方,你不需要它(其中顺序是无关紧要的,普通的字典就足够了)。否则,代码可能会比使用列表更简单。

这适用于任何语言结构/库 - 如果它使您的代码更简单,请使用更高级别的抽象/实现。

0

只要您对这个数据结构感到满意,并且它符合您的需求,为什么要关心?也许它不是更高效的(速度等),但如果它在那里,显然是因为它在某些情况下是有用的(或者没有人会想到写它)。

基本上可以使用三种类型的关联数组在Python:

  1. 经典的哈希表(没有顺序可言)
  2. OrderedDict(为了这反映创建对象的方式)
  3. 和二叉树 - 这不在标准的lib - ,它以自定义顺序(不一定是按字母顺序排列)按照自己的意愿排列它们的键。

所以,其实这个键的顺序可以是的问题。只要选择你认为更适合做这项工作的结构。

+0

小的一点,Python没有数组(在其他语言中可能会用到)。 –

+0

@BurhanKhalid:没有数组?内建'array'类型的用途是什么,然后是由numpy提供的类型,以及pypi上的辅助模块中提供的“bitarray”类型。 – michaelmeyer

6

但我担心这是不好的做法,因为它在我看来,一个关联数组的整个概念是,按键的顺序应该从来不管,

废话。这不是“关联数组的整体概念”。这只是很少很重要,所以我们默认放弃顺序以获得概念上更简单(和更高效)的数据结构。

和依靠排序应该只使用列表,因为这是任何操作,为什么名单存在

停止它在那里!再想一想。 如何你会使用列表?作为(键,值)对的唯一键的列表,对吗?那么恭喜,我的朋友,你刚刚重新发明OrderedDict,只是一个糟糕的API,真的很慢。对有序映射的任何概念性反对也适用于此特殊数据结构。幸运的是,这些反对意见是无稽之谈。有序映射非常好,它们与无序映射完全不同。给它一个适当命名的具有良好API和良好性能的专用实现可以改善人们的代码。

除此之外:列表只是一种有序的数据结构。尽管它们有点普遍,但实际上所有的数据结构都可以由某些列表组合而成(如果向后弯曲),这并不意味着您应该始终使用列表。

我没有这方面的数据,但我敢打赌,列表的性能普遍比OrderedDict更好。

数据(结构)没有(不)没有性能。数据(结构)的操作有。因此它取决于你感兴趣的操作。如果你只需要一个列表对,列表显然是正确的,迭代它或索引它是非常有效的。但是,如果您想要一个也是有序的映射,或者甚至映射功能的一小部分(例如处理重复键),那么单独列表就非常糟糕,正如我上面已经解释的那样。

+0

感谢您的强烈的爱;)这是有用的。 – galarant

相关问题