2011-01-20 3 views
7

У меня есть класс, содержащий список строк. Скажем:Как обеспечить список содержит уникальные элементы?

ClassName: 
- list_of_strings 

Мне нужно обеспечить, чтобы этот список строк содержал уникальные элементы. К сожалению, я не могу изменить этот list_of_strings на другой тип, например, на набор.

В функции addToList(str_to_add), я хочу гарантировать уникальность строки. Как я могу это сделать? Было бы целесообразно добавить строку, добавляемую в список, преобразовать в набор, затем вернуться к списку, а затем переназначить это для объекта?

Вот метод мне нужно обновить:

def addToList(self, str_to_add): 
    self.list_of_strings.append(str_to_add) 

Спасибо!

+0

* Почему * вы не можете использовать набор? Кажется, это подходящий тип данных. –

+0

Можно ли отсортировать список? Если да, то вы можете использовать двоичный поиск. В противном случае вы застряли с некоторым алгоритмом линейного порядка, поэтому преобразование в набор может быть самым простым, если абсолютная скорость не является требованием. – chrisaycock

+0

Предположительно он хочет сохранить порядок, или уже есть код, который ожидает упорядоченный список, а не набор. Упорядоченный набор или уникальный список является разумным типом данных. – bnaul

ответ

21
def addToList(self, str_to_add): 
    if str_to_add not in self.list_of_strings: 
     self.list_of_strings.append(str_to_add) 
+0

Ahh ... вы правы, и это правильно для проблемы, которую я описал. Смутно, я просто понял, что я неправильно описал свою проблему, и проблема, которую я испытываю, совершенно другая. – Cuga

1

Вы действительно могли бы сделать операцию список-к-ром к списку вы описали, но вы также можете использовать оператор in, чтобы проверить, если элемент уже находится в списке перед добавлением его.

4

Либо проверьте наличие строки в списке с помощью in, либо параллельно используйте set, который вы можете проверить и добавить.

+0

Параллельный набор - интересная идея. – kindall

+0

Этот, вероятно, более эффективен с точки зрения поиска, особенно если список большой. – ffledgling

0

Один из возможных способов сделать это - создать хэш-набор и выполнить итерацию по списку, добавив элементы в набор; вторая итерация может быть использована для удаления любых дубликатов.

0

Возможно, мы можем сделать так:

четкости addToList (самостоятельная, str_to_add):

try: 
    self.list_of_strings.index(str_to_add) 
except: 
    self.list_of_strings.append(str_to_add) 

Ну, я не знаю, является ли это тот же механизм, с еще если/другое.

Смежные вопросы