开发者

Remove duplicates from a list (in vim)

This is my list:

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

I would like to know how I can remove the duplicates from this list.

Would it be also possibl开发者_如何转开发e when I add an item to the list to check if the item is already in the list (to avoid duplicates?)


Try

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

. For the second question, see :h index().

By the way, if

  1. all list items are strings;
  2. there is no empty strings possible;
  3. you don't care about order of list items

then you should probably use a Dictionary instead: for large number of strings searching for duplicates is faster (and really not required).


This ex-mode (i.e. enter after :) regex substitution will eliminate the duplicates (provided they are consecutive):

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


You could also convert the list to the keys in a Dictionary:

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)

This works for both sorted and unsorted lists.


Vim 7.4.218 (25 Mar 2014) and newer

provides

uniq({list} [, {func} [, {dict}]])          *uniq()* *E882*
        Remove second and succeeding copies of repeated adjacent
        {list} items in-place.  Returns {list}.  If you want a list
        to remain unmodified make a copy first: >
            :let newlist = uniq(copy(mylist))
<       The default compare function uses the string representation of
        each item.  For the use of {func} and {dict} see |sort()|.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜