ver vacia una tuplas tabla ordenar ordenada objetos lista esta crear ascendentemente python list

vacia - python ordenar tuplas



¿Cómo crear una clase de lista personalizada en python? (5)

En Python 3 tenemos hermosas collections.UserList([list]) :

Clase que simula una lista. El contenido de la instancia se mantiene en una lista regular, a la que se puede acceder a través del atributo de datos de las instancias de UserList. El contenido de la instancia se establece inicialmente en una copia de la lista, y se establece de forma predeterminada en la lista vacía [] . la lista puede ser cualquier iterable, por ejemplo, una lista real de Python o un objeto UserList.

Además de admitir los métodos y operaciones de secuencias mutables, las instancias de UserList proporcionan el siguiente atributo: data Un objeto de lista real que se utiliza para almacenar el contenido de la clase UserList.

https://docs.python.org/3/library/collections.html#userlist-objects

Me gustaría escribir una clase de lista personalizada en Python (llamémosla MyCollection ) donde eventualmente puedo llamar:

for x in myCollectionInstance: #do something here

¿Cómo voy a hacer eso? ¿Hay alguna clase que deba ampliar o hay alguna función que debo anular para hacerlo?


Me gusta subclasificar MutableSequence , según lo recomendado por Alex Martelli . Esto me funciona bien, particularmente cuando necesito agregar métodos personalizados en la parte superior de la lista que estoy creando.

from collections import MutableSequence class MyList(MutableSequence): """A container for manipulating lists of hosts""" def __init__(self, data=None): """Initialize the class""" super(MyList, self).__init__() if (data is not None): self._list = list(data) else: self._list = list() def __repr__(self): return "<{0} {1}>".format(self.__class__.__name__, self._list) def __len__(self): """List length""" return len(self._list) def __getitem__(self, ii): """Get a list item""" return self._list[ii] def __delitem__(self, ii): """Delete an item""" del self._list[ii] def __setitem__(self, ii, val): # optional: self._acl_check(val) self._list[ii] = val def __str__(self): return str(self._list) def insert(self, ii, val): # optional: self._acl_check(val) self._list.insert(ii, val) def append(self, val): self.insert(len(self._list), val) if __name__==''__main__'': foo = MyList([1,2,3,4,5]) foo.append(6) print foo # <MyList [1, 2, 3, 4, 5, 6]>


Podrías extender la list clases:

class MyList(list): def __init__(self, *args): super(MyList, self).__init__(args[0]) # Do something with the other args (and potentially kwars)

Ejemplo de uso:

a = MyList((1,2,3), 35, 22) print(a) for x in a: print(x)

Rendimiento esperado:

[1, 2, 3] 1 2 3


Tu list subclases si tu colección básicamente se comporta como una lista:

class MyCollection(list): def __init__(self, *args, **kwargs): super(MyCollection, self).__init__(args[0])

Sin embargo, si su deseo principal es que su colección sea compatible con el protocolo iterador, solo tiene que proporcionar un método __iter__ :

class MyCollection(object): def __init__(self): self._data = [4, 8, 15, 16, 23, 42] def __iter__(self): for elem in self._data: yield elem

Esto le permite iterar sobre cualquier instancia de MyCollection .