sparse assignment list in python
Question: I need a list with the following behavior

    
    
    >>> 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
    

Although it can "emulated" via a dictionary, it's not exactly the same. numpy
array can behave this way, but I don't want to import the whole numpy for
something like this. Before coding it myself, I ask if something similar
exists in the standard library.


Answer: Here's minimal code to pass your given examples (with indispensable
adjustments: you expect weird spacing and quoting, 'None' to be printed out at
the prompt without a `print` statement, etc etc):

    
    
    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)
    

I imagine you'll want more (to support negative indices, slicing, and whatever
else), but this is all your examples are implicitly specifying.

