2013-11-07 2 views
1

Есть ли более Pythonic (или сжатый) способ предотвратить добавление дубликата в список?Есть ли еще Pythonic способ предотвратить добавление дубликата в список?

if item not in item_list: 
    item_list.append(item) 

Или это действительно дешевая операция?

+0

это хороший один, и его вещий слишком –

ответ

5

С @ hcwsha Оригинальное решение было заменено, я записываю его здесь:

seen = set(item_list) 

# [...] 

if item not in seen: 
    seen.add(item) 
    item_list.append(item) 

Это работает в O (1) и поэтому может считаться лучше, чем тот, который вы используете в настоящее время.

+0

хороший, это работает как ч Во всяком случае, я не понимаю, зачем использовать .add и .append. Я только что использовал «.add» и преобразовал набор в список, используя список (см.). –

+1

@MiguelOrtiz Я предполагаю, что порядок ваших предметов не важен. – Johnsyweb

0

Вы можете использовать встроенный в set() функции, как показано ниже, и функция list() для преобразования этого набора объектов к нормальному списку питона:

item_list = ['a','b','b'] 

print list(set(item_list)) 
#['a', 'b'] 

Примечание: Порядок не поддерживается при использовании наборов

+0

Вы можете отметить, что порядок не может поддерживаться – thefourtheye

2

Использовать set для отслеживания замеченных предметов, sets provide O(1) lookup.

>>> item_list = [1, 7, 7, 7, 11, 14 ,100, 100, 4, 4, 4] 
>>> seen = set() 
>>> item_list[:] = [item for item in item_list 
             if item not in seen and not seen.add(item)] 
>>> item_list 
[1, 7, 11, 14, 100, 4] 

Если заказ не имеет значения, а затем просто использовать set() на item_list:

>>> set(item_list) 
set([1, 100, 7, 11, 14, 4]) 
1

Ваш путь замечательный! Набор полезен для такого рода вещей, но, как упоминалось ранее, они не поддерживают порядок. Другие способы написания немного более кратко, хотя, возможно, не ясно, показаны ниже:

item_list.append(item) if item not in item_list else None 

и

item_list += [item] if item not in item_list else [] 

этот последний может быть адаптирована, если вы хотите добавить несколько new_items = [item1, ...] как так

item_list += [item for item in new_items if item not in item_list] 
Смежные вопросы