I need a list with the following behavior
>>> l = SparseList() >>> l  >>> l = "hello" >>> l [ None, None, "hello"] >>> l None >>> l = 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.
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
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 = "hello" >>> l [None, None, 'hello'] >>> print l None >>> l = 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.