2012-08-07 25 views
6

Sık sık sözde kod yerine Python kullanıyorum. Bunun için bir yığının olmasını isterim. Listeleri kullanmanın yolu (source) olduğunu biliyorum, ancak bir yığın kullandığımı açıklamak için myList.append yerine myList.push kullanmak istiyorum.Python'da bir listeye bir işlem ekleyebilir miyim?

ben ekleme işlemi için bir takma ad tanımlamak için

myList.push = myList.append 

gibi basit bir şey yapabileceğini düşündüm ama

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

push-operasyonu eklemek için bir kısa çözümü mu olsun bir listeye var mı?

(Gelmeli mahvetme benim çalıştırılabilir Python yalancı kod) Böyle listenin bir alt sınıfı yapabilirsiniz

+0

btw - böylece soru listeye 'için bir takma ad atayabilirsiniz gerçekten http://stackoverflow.com/questions/1566266/why-is-pythons-append-not-push –

+0

bakın. takma (x) 'takma ad, itme (x)' gibi bir şey olurdu? –

cevap

12

:

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

özel sınıf aynı şekilde kullanın yapacağınız nasıl aynı işlevlerine aliasing hakkında yerine tanımlayıp ait

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

"itme" ön tarafa eklenmiyor mu? Bu durumda .insert (0, x) kullanılmalıdır. – monkut

+0

deques, bu amaçlarla listelerinden daha hızlı olacaktır. –

+0

@monkut: Bu makul görünüyor, ancak, ters işlem ('list.pop') varsayılan olarak listeden son öğeyi çıkarır. Yani 'push' ile' list.append' komutunu uygulamak daha iyidir, bu yüzden alt sınıfta 'pop (0) 'ya da' pop' geçersiz kılmanız gerekmez. – mhawke

5

: düzenli listesini kullanmak açık?

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

Bu, ekin işlevselliğini de korur.

+0

Bu tamam. Liste yapım semantiğini korumak için (örn. 'List ((1,2,3,4))' '__init__' yöntemini' * args' ve '** kwargs'ı kabul edebilir ve sonra bunları temel sınıfa geçirebilirsiniz' __init__ super (List, self) .__ init __ (* args, ** kwargs) ' – mhawke

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

Cevabınız için teşekkürler. Düşündüğüm şey buydu ama hatırlayamadım. Benim pseudocode için hatları tamam ve sonuç cevabınız için biraz temiz => +1 görünüyor –

0
>>> stack = type('stack', (list,), {'push':list.append})() 
>>> stack.push(1) 
>>> stack.pop() 
1 
>>> 
İlgili konular