2011-07-08 35 views
6

Ésta es mi lista:eliminar duplicados de una lista (en vim)

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

me gustaría saber cómo puedo eliminar los duplicados de esta lista.

¿Sería también posible cuando agrego un elemento a la lista para comprobar si el objeto ya está en la lista (para evitar duplicados?)

+0

Tu pregunta no está clara. ¿Quiere decir eliminar líneas duplicadas en VIM? – Rahul

+0

lo siento, no de una matriz en vimscript – Reman

Respuesta

13

Trate

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

. Para la segunda pregunta, vea :h index().

Por cierto, si

  1. todos los elementos de la lista son cadenas;
  2. no hay cadenas vacías posibles;
  3. que no se preocupan por el orden de los elementos de lista

entonces usted probablemente debería usar un diccionario en su lugar: para un gran número de cadenas en busca de duplicados es más rápido (y realmente no es obligatorio).

+0

muchas gracias. :) – Reman

3

Este ex-modo (es decir, entrar después de :) sustitución de expresiones regulares eliminará los duplicados (siempre que sean consecutivas):

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

tengo que amar vim y todas sus sutilezas – ojblass

2

También puede convertir la lista de las claves en un diccionario:

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) 

Esto funciona para listas clasificadas y no ordenadas.

Cuestiones relacionadas