2013-12-16 2 views
-1

я должен отфильтровать повторяющиеся значения в списке пониманиеКак отфильтровать повторяющиеся значения в списке понимание в Python без использования набора

with open(file_name, 'rU') as input_file:   
     result = [unique for unique in [process(line) for line in input_file] if **unique_not_in_generated_list**] 

Какое выражение можно использовать вместо unique_not_in_generated_list?

питона 2,7

+7

Почему отвращение к набору? – mgilson

ответ

2

Вы можете использовать sorted и itertools.groupby как этот

from itertools import groupby 
print [unique for unique, _ in groupby(sorted(process(line) for line in input_file))] 

Примечание: Это не сохраняет порядок данных, но гарантировано для создания уникальных предметов без использования наборов.

+1

Он воздерживается от набора, возможно, потому, что он не хочет менять порядок. Сортировка отменяется. – SuperSaiyan

+0

Не сортировать ли сортировку строки, хотя/ – inspectorG4dget

+0

@Thrustmaster Thats явно не упоминается в вопросе :( – thefourtheye

0

Просто используйте выражение генератора и set():

with open(file_name, 'rU') as input_file:   
    result = list(set(process(line) for line in input_file)) 

Если необходимо сохранить порядок, вы можете использовать множество. Я также жертвуют список понимание в пользу читаемости:

result = list() 
seen = set() 

with open(file_name, 'rU') as input_file: 
    for line in input_file: 
     unique = process(line) 
     if unique not in seen: 
      seen.add(unique) 
      result.append(unique) 

Если вы настаиваете на использовании списка понимания и поддержания порядка, вы можете сделать это, используя одноразовые список None с, но это своего рода поражения цели и является O (N^2)

result = list() 
with open(file_name, 'rU') as input_file: 
    [result.append(x) for process(x) in input_file if process(x) not in result] 
4

Вот один вкладыш для удаления дубликатов, сохраняя при этом линии заказанные. Использовать collections.OrderedDict's fromkeys

result = list(OrderedDict.fromkeys(process(line) for line in input_file)) 
Смежные вопросы