如何实现位置感知项的python列表

时间:2013-09-10 19:21:55

标签: python list data-structures

我需要一个特殊情况列表,列表项可以知道(具有属性/属性),告诉:

  • 该项目是否是列表中的最后一项
  • 列表中的索引或“枚举器”

我能想到的方法是:

  1. 覆盖__setitem____add__insertappendpop et。人
  2. 不将它们存储在python列表中,但是具有指向下一个项目的“next”属性。
  3. 在评估之前(或更新之后)添加辅助函数以同步索引属性
  4. 不要将它们存储为属性,而是在“类”
  5. 之外处理它们

    1)看起来像大多数pythonic方法,但需要覆盖相当多的方法。 2)有必须重新实现所述方法的问题(如果我想要insert()pop(),并没有真正帮助索引) 3)& 4)有“你必须记得在做Y之前调用X”的陷阱

    所述列表中的所有项目将(或应该)始终是同一类的实例。

    我不知道这种或pythonic方法的已知设计模式吗?

2 个答案:

答案 0 :(得分:3)

我同意Marcin,因为你不应该需要这个。但是,无论出于什么晦涩的原因,如果你真的真的确实需要这个功能,那么这是一个不错的开始:

class Node:
    def __init__(self, data):
        self.data = data
        self.index = 0
        self.next = None

class myContainer:
    def __init__(self, node):
        self.head = node
        self.length = 1
    def __setitem__(self, i, node):
        if i > self.length:
            raise ValueError("Index %s is too large. Cannot set item at that index. Current container length is %s" %(i, self.length))
        curr = self.head
        while i>0:
            curr = curr.next
            curr.next, node.next = node, curr.next
            node.index = curr.index + 1
        curr = node.next
        while curr is not None:
            curr.index += 1
            curr = curr.next

答案 1 :(得分:2)

  

我需要一个特殊情况列表,列表项可以知道(具有属性/属性),告诉:     该项目是否是列表中的最后一项; [和]     列表中的索引或“枚举器”

不,不。您要求代码的其他部分适当地处理最后一个元素,或者使用索引。

没有干净的方法来做你要求的事情,因为列表对象应该负责跟踪这些事情。在大多数情况下,列表项应该具有保存其父列表的属性,但即便如此,我也不建议这样做。

重写您的代码以保留对列表的引用。