2012-08-07 11 views
6

Spesso uso Python invece di pseudocodice. Per quello, mi piacerebbe avere uno stack. So che usare le liste è la strada da percorrere (source), ma mi piacerebbe usare myList.push piuttosto che myList.append per chiarire che io uso uno stack.Posso aggiungere un'operazione a un elenco in Python?

ho pensato che avrei potuto fare qualcosa di semplice come

myList.push = myList.append 

per definire un alias per l'operazione di aggiunta, ma ho

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

Does una breve soluzione per l'aggiunta di un push-operazione esiste una lista?

(Non dovrebbe rovinare il mio eseguibile Python-pseudocodice)

+0

btw - vedere http://stackoverflow.com/questions/1566266/why-is-pythons-append-not-push –

+0

così la tua domanda è davvero si può assegnare un alias a 'lista. append (x) 'dove l'alias sarebbe qualcosa come' push (x) '? –

risposta

12

È possibile effettuare una sottoclasse di lista come questo:

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

Utilizzare la classe personalizzata nello stesso modo si farebbe usa una lista regolare:

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

non "spinge" per aggiungerlo in primo piano? nel qual caso deve essere usato .insert (0, x). – monkut

+0

deques sarà più veloce di liste per questo scopo. –

+0

@monkut: sembra ragionevole, tuttavia l'operazione inversa ('list.pop') apre l'ultimo elemento dall'elenco per impostazione predefinita. Quindi è meglio implementare 'push' con' list.append' in modo da non dover 'pop (0)' o sovrascrivere 'pop' nella sottoclasse. – mhawke

5

Invece di ridefinire, che dire di aliasing delle stesse funzioni sopra ?

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

Ciò manterrebbe anche la funzionalità di append.

+0

Questo è OK. Per preservare la semantica della costruzione di liste (ad es. 'List ((1,2,3,4))' puoi fare in modo che il metodo '__init__' accetti' * args' e '** kwargs' e poi li passi alla classe di base' __init__ 'tramite' super (Lista, self) .__ init __ (* args, ** kwargs) ' – mhawke

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

Grazie per la risposta. Questo è quello che ho pensato ma non riuscivo a ricordare, anche se ho accettato l'altra risposta come penso aggiungendo 3 le righe verso il mio pseudocodice sono ok e il risultato sembra un po 'più pulito => +1 per la tua risposta –

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