2012-08-07 46 views
6

我經常使用Python而不是僞代碼。爲此,我想有一個堆棧。我知道使用列表是要走的路(source),但我想使用myList.push而不是myList.append來明確我使用堆棧。我可以將操作添加到Python中的列表嗎?

我想我可以做一些簡單的像

myList.push = myList.append 

定義追加操作的別名,但我得到

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

難道一個解決方案添加一鍵操作到一個列表存在?

(應該不會弄亂我的可運行的Python的僞代碼)

+0

順便說一句 - 見http://stackoverflow.com/questions/1566266/why-is-pythons-append-not-push – 2012-08-07 07:30:33

+0

所以你的問題是真的,你可以一個別名分配給'名單。 append(x)'其中別名會像'push(x)'? – 2012-08-07 07:49:40

回答

12

您可以列表的這樣的一個子類:

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

使用自定義類相同的方式將使用常規列表:

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

不「推」添加到前面?在這種情況下,應該使用.insert(0,x)。 – monkut 2012-08-07 07:39:25

+0

爲此,deques將比列表更快。 – 2012-08-07 07:50:16

+0

@monkut:這聽起來很合理,但是,逆操作('list.pop')默認彈出列表中最後一項。所以最好用'list.append'實現'push',這樣你就不必在子類中'pop(0)'或重寫'pop'。 – mhawke 2012-08-07 09:02:38

5

而不是重新定義,如何混淆相同的功能上 ?

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

這會保留附加功能。

+0

這是好的。爲了保留列表構造語義(例如'List((1,2,3,4))',你可以讓'__init__'方法接受'* args'和'** kwargs',然後將這些傳遞給基類'__init__ ''via'super(List,self).__ init __(* args,** kwargs)' – mhawke 2012-08-07 09:12:53

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

感謝您的回答,這是我想到的,但不記得了。我的僞代碼行是好的,結果看起來有點清潔=> +1爲您的答案 – 2012-08-07 09:15:22

0
>>> stack = type('stack', (list,), {'push':list.append})() 
>>> stack.push(1) 
>>> stack.pop() 
1 
>>> 
相關問題