2012-08-07 9 views
6

私はしばしば擬似コードの代わりにPythonを使用しています。そのために、私はスタックを持っていたいと思います。私はリストを使用する方法(source)を知っているが、myList.appendではなくmyList.pushを使用して、スタックを使用することを明確にしたいと思います。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 –

+0

ので、あなたの質問は本当にあなたがリスト 'にエイリアスを割り当てることができているを参照してください。 append(x) 'エイリアスは' push(x) 'のようなものでしょうか? –

答えて

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

+0

dequesはこの目的のためにリストより高速です。 –

+0

@monkut:しかし、逆の操作( 'list.pop')は、デフォルトでリストの最後の項目をポップします。ですから、 'list.append'で' push 'を実装する方が良いので、サブクラスで 'pop(0)'やオーバーライドする必要はありません。 – mhawke

5

再定義の代わりに、同じ機能をエイリアシングする方法に?

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

これは、追加機能も保持します。ところで

+0

これは問題ありません。リスト構築のセマンティクス(例えば 'List((1,2,3,4)) 'を保持するために、' __init__'メソッドが '* args'と' ** kwargs'を受け入れ、それらを基本クラス '__init__ – mhawke

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

あなたの答えをありがとう。これは私が思ったものの、覚えていないものです。しかし、私は3つ追加すると他の答えを受け入れました。私の擬似コードへの行は大丈夫です。結果はちょっときれいに見える=>あなたの答えは+1です –

0
>>> stack = type('stack', (list,), {'push':list.append})() 
>>> stack.push(1) 
>>> stack.pop() 
1 
>>> 
関連する問題