Lista de tareas dispersas en python

Necesito una lista con el siguiente comportamiento.

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

Aunque se puede “emular” a través de un diccionario, no es exactamente lo mismo. La matriz numpy puede comportarse de esta manera, pero no quiero importar todo el numpy para algo como esto. Antes de codificarlo yo mismo, pregunto si existe algo similar en la biblioteca estándar.

Aquí hay un código mínimo para pasar sus ejemplos dados (con ajustes indispensables: espera que haya espacios y comillas extraños, que se imprima ‘Ninguno’ en el indicador sin una statement print , 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) 

Me imagino que querrá más (para admitir índices negativos, rebanar y cualquier otra cosa), pero esto es todo lo que sus ejemplos están especificando implícitamente.

Los diccionarios se pueden utilizar como listas dispersas. Si bien no proporcionarán las características que está buscando (como no está realmente después de una lista dispersa, todos los elementos de la lista son referencias completas a Ninguna en una matriz de tamaño dynamic), actúan como una matriz dispersa de libros de texto.

  sparse_vars = [(0, "Hi"), (10000, "Bye"), (20000, "Try")]
 sparse_list = {}

 para var en sparse_vars:
   sparse_list [var [0]] = var [1]

 >>> imprimir sparse_list
 {0: 'Hola', 10000: 'Adiós', 20000: 'Probar'}
 >>> imprimir sparse_list [20000]
 'Tratar'