Удалить дубликаты из списка (в vim) - PullRequest
7 голосов
/ 09 июля 2011

Это мой список:

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

Я хотел бы знать, как я могу удалить дубликаты из этого списка.

Будет ли это возможно при добавлении элемента всписок, чтобы проверить, есть ли элемент в списке (чтобы избежать дублирования?)

Ответы [ 4 ]

14 голосов
/ 09 июля 2011

Попробуйте

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

. По второму вопросу см. :h index().

Кстати, если

  1. все элементы списка являются строками;
  2. пустые строки невозможны;
  3. вам не важен порядок пунктов списка

тогда вам, вероятно, следует вместо этого использовать словарь: для большого числа строк поиск дубликатов происходит быстрее (и действительно не требуется).

4 голосов
/ 09 июля 2011

Подстановка регулярного выражения в бывшем режиме (т. Е. Ввод после :) удалит дубликаты (при условии, что они являются последовательными):

s/\('[0-9]\+'\),\s\+\1/\1/g
3 голосов
/ 14 августа 2013

Вы также можете преобразовать список в ключи в словаре:

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)

Это работает как для отсортированных, так и для несортированных списков.

2 голосов
/ 01 апреля 2018

Vim 7.4.218 (25 марта 2014 г.) и новее

обеспечивает

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()|.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...