2010-05-25 23 views
6

Trong python, bạn có thể làm điều gì đó nhưtrích xuất/lát/sắp xếp lại danh sách trong (emacs) lisp?

i = (0, 3, 2) 
x = [x+1 for x in range(0,5)] 
operator.itemgetter(*i)(x) 

để có được (1, 4, 3). In (emacs) lisp, tôi đã viết chức năng này được gọi là chiết xuất mà làm điều gì đó tương tự,

(defun extract (elems seq) 
    (mapcar (lambda (x) (nth x seq)) elems)) 

(extract '(0 3 2) (number-sequence 1 5)) 

nhưng tôi cảm thấy như có một cái gì đó nên được xây dựng vào? Tất cả những gì tôi biết là first, last, rest, nth, car, cdr ... Con đường để đi là gì? ~ Cảm ơn trước ~

Trả lời

4

Nếu vấn đề của bạn là tốc độ sau đó sử dụng (vectơ 1 2 3 4 5) thay vì danh sách và (chỉ mục vec aref) để lấy phần tử.

(defun extract (elems seq) 
    (let ((av (vconcat seq))) 
    (mapcar (lambda (x) (aref av x)) elems))) 

Nếu bạn định trích xuất cùng một chuỗi nhiều lần, bạn cần lưu trữ chuỗi trong vectơ một lần. Danh sách Python thực sự là mảng một chiều, tương đương trong LISP là vectơ.

+0

Không biết điều đó. Vì vậy, đối với vấn đề này, tôi phải quyết định xem chi phí của việc tạo ra một véc tơ có đáng giá thêm phí truy cập không đổi. – hatmatrix

2

Tôi chỉ thực hiện kịch bản đơn giản trong elisp, nhưng đó là một ngôn ngữ tương đối nhỏ. Và extract là một chức năng rất kém hiệu quả trong danh sách liên kết, đó là cấu trúc dữ liệu mặc định trong các emacs lisp. Vì vậy, nó không thể được xây dựng trong.

Giải pháp của bạn là giải pháp đơn giản nhất. Đó là n^2, nhưng để làm cho nó nhanh hơn đòi hỏi nhiều mã hơn.

Dưới đây là dự đoán như thế nào nó có thể làm việc, nhưng nó cũng có thể là hoàn toàn tắt cơ sở:

  1. loại elems (n log n)
  2. tạo ra một bản đồ mà các bản đồ các yếu tố trong sắp xếp elem để họ các chỉ số trong bản gốc elem (có thể là n log n, có thể n)
  3. lặp qua seq và được sắp xếp elem. Chỉ giữ lại các chỉ số trong sắp xếp elem (có thể là n, có lẽ n log n, tùy thuộc vào việc nó là một bản đồ băm hoặc một bản đồ cây)
  4. loại kết quả bởi các giá trị của các bản đồ elem (n log n)
+0

Tuyệt vời - cảm ơn bạn ... – hatmatrix

1

Từ My Lisp Experiences and the Development of GNU Emacs:

Có những người trong những ngày đó, vào năm 1985, người có máy một megabyte mà không cần bộ nhớ ảo. Họ muốn có thể sử dụng GNU Emacs. Điều này có nghĩa là tôi phải giữ chương trình càng nhỏ càng tốt.

Ví dụ: tại thời điểm cấu trúc vòng lặp duy nhất là ‘while’, cực kỳ đơn giản. Không có cách nào để thoát ra khỏi câu lệnh ‘while’, bạn chỉ cần nắm bắt và ném, hoặc kiểm tra một biến chạy vòng lặp. Điều đó cho thấy tôi đã cố gắng giữ những thứ nhỏ đến mức nào. Chúng tôi không có ‘caar’ và ‘cadr’ và vân vân; "Vắt kiệt mọi thứ có thể" là tinh thần của GNU Emacs, tinh thần của Emacs Lisp, ngay từ đầu.

Rõ ràng, các máy giờ đây lớn hơn và chúng tôi không làm theo cách đó nữa. Chúng ta đặt vào ‘caar’ và ‘cadr’ và vân vân, và chúng ta có thể đặt một cấu trúc vòng lặp khác vào một trong những ngày này.

Vì vậy, tôi đoán là, nếu bạn không nhìn thấy nó, nó không có ở đó.

Các vấn đề liên quan