代码之家  ›  专栏  ›  技术社区  ›  Stefano Borini

python中的稀疏赋值列表

  •  13
  • Stefano Borini  · 技术社区  · 16 年前

    我需要一个具有以下行为的列表

    >>> l = SparseList()
    >>> l
    []
    >>> l[2] = "hello"
    >>> l
    [ None, None, "hello"]
    >>> l[5]
    None
    >>> l[4] = 22
    >>> l
    [ None, None, "hello", None, 22]
    >>> len(l)
    5
    >>> for i in l: print i
    None
    None
    "hello"
    None
    22
    

    2 回复  |  直到 7 年前
        1
  •  25
  •   Alex Martelli    16 年前

    下面是传递给定示例的最少代码(需要进行必要的调整:您希望在提示时使用奇怪的间距和引号“None”,而不使用 print 声明等):

    class SparseList(list):
      def __setitem__(self, index, value):
        missing = index - len(self) + 1
        if missing > 0:
          self.extend([None] * missing)
        list.__setitem__(self, index, value)
      def __getitem__(self, index):
        try: return list.__getitem__(self, index)
        except IndexError: return None
    
    __test__ = dict(allem='''
    >>> l = SparseList()
    >>> l
    []
    >>> l[2] = "hello"
    >>> l
    [None, None, 'hello']
    >>> print l[5]
    None
    >>> l[4] = 22
    >>> l
    [None, None, 'hello', None, 22]
    >>> len(l)
    5
    >>> for i in l: print i
    None
    None
    hello
    None
    22
    ''')
    import doctest
    doctest.testmod(verbose=1)
    

    我想您会想要更多(支持负索引、切片等),但这就是您的示例隐式指定的全部内容。

        2
  •  7
  •   wjandrea sebs    5 年前

    字典可以用作稀疏列表。 虽然它们不会提供您所追求的特征(因为您实际上并不追求稀疏列表,所以在动态大小的数组中,所有列表元素都是对无元素的完全引用),但它们充当教科书式的稀疏数组。

    sparse_vars = [(0,"Hi"), (10000,"Bye"), (20000,"Try")]
    sparse_list = {}
    
    for var in sparse_vars:
      sparse_list[var[0]] = var[1]
    
    >>> print sparse_list
    {0: 'Hi', 10000: 'Bye', 20000: 'Try'}
    >>> print sparse_list[20000]
    'Try'