2011-07-08 33 views
6

Đây là danh sách của tôi:Hủy bỏ bản sao từ một danh sách (trong vim)

['02', '03', '03', '16', '17', '17', '28', '29', '29'] 

Tôi muốn biết làm thế nào tôi có thể loại bỏ các bản sao ra khỏi danh sách này.

Nó sẽ được Cũng có thể khi tôi thêm một mục vào danh sách để kiểm tra nếu mục là đã có trong danh sách (để tránh trùng lặp?)

+0

Câu hỏi của bạn không rõ ràng. Bạn có nghĩa là loại bỏ các dòng trùng lặp trong VIM? – Rahul

+0

xin lỗi, không từ một mảng trong vimscript – Reman

Trả lời

13

Hãy thử

let list=['02', '03', '03', '16', '17', '17', '28', '29', '29'] 
let unduplist=filter(copy(list), 'index(list, v:val, v:key+1)==-1') 

. Đối với câu hỏi thứ hai, xem :h index().

Bằng cách này, nếu

  1. tất cả các mục danh sách là chuỗi;
  2. không có chuỗi trống nào có thể;
  3. bạn không quan tâm đến thứ tự của danh sách các mục

thì có thể bạn nên sử dụng một từ điển thay vì: cho số lượng lớn các chuỗi tìm kiếm bản sao là nhanh hơn (và thực sự không bắt buộc).

+0

cảm ơn bạn rất nhiều. :) – Reman

3

cũ Chế độ này (tức là nhập sau :) thay thế regex sẽ loại bỏ các bản sao (miễn là họ liên tiếp):

s/\('[0-9]\+'\),\s\+\1/\1/g 
+0

gotta yêu vim và tất cả sự tinh tế – ojblass

2

Bạn cũng có thể chuyển đổi danh sách để các phím trong một từ điển:

let list=['02', '03', '03', '16', '17', '17', '28', '29', '29'] 
let dict = {} 
for l in list 
    let dict[l] = '' 
endfor 
let uniqueList = keys(dict) 

Điều này phù hợp với cả danh sách được sắp xếp và chưa được phân loại.

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