2012-08-07 26 views
6

Suelo utilizar Python en lugar de pseudocódigo. Para eso, me gustaría tener una pila. Sé que usar listas es el camino a seguir (source), pero me gustaría usar myList.push en lugar de myList.append para dejar claro que utilizo una pila.¿Puedo agregar una operación a una lista en Python?

pensé que podía hacer algo tan simple como

myList.push = myList.append 

para definir un alias para la operación de anexión, pero me da

stack.push = stack.append 
AttributeError: 'list' object has no attribute 'push' 

¿Un solución a cortopara añadir una flexión de la operación a una lista existe?

(debe no desordenes mi ejecutable de Python-pseudocódigo)

+0

por cierto - ver http://stackoverflow.com/questions/1566266/why-is-pythons-append-not-push –

+0

lo que su pregunta es realmente se puede asignar un alias a 'lista. append (x) 'donde el alias sería algo así como' push (x) '? –

Respuesta

12

Se puede hacer una subclase de lista así:

class List(list): 
    def push(self, x): 
     self.append(x) 

Utilice la clase personalizada de la misma manera que lo haría use una lista normal:

>>> s = List() 
>>> s.push(10) 
>>> s.push(20) 
>>> s 
[10, 20] 
+1

no "empuja" para agregarlo al frente? en cuyo caso se debe usar .insert (0, x). – monkut

+0

deques será más rápido que las listas para este propósito. –

+0

@monkut: eso suena razonable, sin embargo, la operación inversa ('list.pop') saca el último elemento de la lista de forma predeterminada. Por lo tanto, es mejor implementar 'push' con' list.append' para que no tenga que 'pop (0)' o anular 'pop' en la subclase. – mhawke

5

En lugar de redefinir, ¿qué tal aliasing the same functi en ?

class List(list): 
    def __init__(self): 
     self.push = self.append 

Esto retendría la funcionalidad de añadir también.

+0

Esto está bien. Para preservar la semántica de la construcción de listas (por ejemplo, 'List ((1,2,3,4))' puedes hacer que el método '__init__' acepte' * args' y '** kwargs' y luego pasarlos a la clase base' __init__ 'via' super (Lista, self) .__ init __ (* args, ** kwargs) ' – mhawke

1
>>> a = [] 
>>> push = a.append 
>>> push(1) 
>>> a 
[1] 
>>> 
+0

Gracias por su respuesta. Esto es lo que pensé pero no pude recordar. Sin embargo, acepté la otra respuesta porque creo que agregué 3 las líneas de mi pseudocódigo están bien y el resultado parece un poco más limpio => +1 por tu respuesta –

0
>>> stack = type('stack', (list,), {'push':list.append})() 
>>> stack.push(1) 
>>> stack.pop() 
1 
>>> 
Cuestiones relacionadas