2012-08-07 69 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 
>>> 
相关问题