2012-08-07 22 views
6

Tôi khá thường xuyên sử dụng Python thay vì mã giả. Đối với điều đó, tôi muốn có một ngăn xếp. Tôi biết rằng việc sử dụng danh sách là cách để đi (source), nhưng tôi muốn sử dụng myList.push thay vì myList.append để làm rõ rằng tôi sử dụng ngăn xếp.Tôi có thể thêm hoạt động vào danh sách bằng Python không?

Tôi nghĩ tôi có thể làm một cái gì đó đơn giản như

myList.push = myList.append 

để xác định một bí danh cho các hoạt động phụ thêm, nhưng tôi nhận

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

Liệu một giải pháp ngắn để thêm một push-hoạt động vào một danh sách tồn tại?

(Nó không nên lộn xộn lên Runnable tôi Python-giả)

+0

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

+0

vì vậy câu hỏi của bạn thực sự là bạn có thể gán một bí danh cho 'danh sách. append (x) 'trong đó bí danh sẽ giống như' push (x) '? –

Trả lời

12

Bạn có thể tạo một lớp con của danh sách như thế này:

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

Sử dụng lớp tùy chỉnh của bạn theo cách tương tự như bạn sử dụng danh sách thông thường:

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

không "đẩy" thêm nó vào mặt trước? trong trường hợp này .insert (0, x) nên được sử dụng. – monkut

+0

deques sẽ nhanh hơn danh sách cho mục đích này. –

+0

@monkut: có vẻ hợp lý, tuy nhiên, thao tác nghịch đảo ('list.pop') sẽ xuất hiện mục cuối cùng khỏi danh sách theo mặc định. Vì vậy, tốt hơn nên thực hiện 'push' với' list.append' để bạn không phải 'pop (0)' hoặc ghi đè 'pop' trong lớp con. – mhawke

5

Thay vì xác định lại, cách phân biệt cùng một functi trên ?

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

Điều này cũng sẽ giữ nguyên chức năng của phụ thêm.

+0

Điều này là OK. Để duy trì ngữ nghĩa xây dựng danh sách (ví dụ 'List ((1,2,3,4))' bạn có thể làm cho phương thức '__init__' chấp nhận' * args' và '** kwargs' và sau đó chuyển chúng vào lớp cơ sở' __init__ 'thông qua 'siêu (Danh sách, tự) .__ init __ (* args, ** kwargs)' – mhawke

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

Cảm ơn câu trả lời của bạn Đây là những gì tôi nghĩ nhưng không thể nhớ được Mặc dù, tôi chấp nhận câu trả lời khác như tôi nghĩ rằng thêm 3 các dòng vào mã giả của tôi là ok và kết quả có vẻ sạch hơn một chút => +1 cho câu trả lời của bạn –

0
>>> stack = type('stack', (list,), {'push':list.append})() 
>>> stack.push(1) 
>>> stack.pop() 
1 
>>> 
Các vấn đề liên quan