2010-10-20 3 views
1

Мне нужно прочитать файл журнала, извлечь все пути и вернуть отсортированный список путей, не содержащих дубликатов. Каков наилучший способ сделать это? Использование set?Устранение дубликатов - использовать набор?

Я думал о чем-то вроде этого:

def geturls(filename) 
    f = open(filename) 
    s = set() # creates an empty set? 

    for line in f: 
    # see if the line matches some regex 

    if match: 
     s.add(match.group(1)) 

    f.close() 

    return sorted(s) 

EDIT

Элементы, поставленные в наборе пути строки, которые должны быть возвращены функциями как список, отсортированный в алфавитном порядке.

EDIT 2 Вот некоторые примерные данные:

10.254.254.28 - - [06/Август/2007: 00: 12: 20 -0700] «GET /Кайзер/22300/HTTP/1.0 "302 528" - " " Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv: 1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 " 10.254.254.58 - - [06/Aug/2007: 00: 10: 05 -0700] "GET /edu/languages/google-python-class/images/puzzle/a-baaa.jpg HTTP/1.0" 200 2309 "-" " googlebot-mscrawl-moma (предприятие ISE; bar-XYZ; foo123 @ google.com, foo123 @ google.com, foo123 @ google.com, foo123 @ google.com) " 10.254.254.28 - - [06/Aug/2007: 00: 11: 08 -0700]" GET /favicon.ico HTTP/1.0" 302 3404 "-" «Googlebot-mscrawl-MOMA (предприятие;. бар-XYZ,

интересная часть являются URLs между GET и HTTP Может быть, я хотел бы упомянуть, что это является частью упражнений, и нет реального мира данные.

+0

Ваше изменение не помогло. – SilentGhost

+0

@ Силлен, я думаю, он пытается сосредоточиться на дублированной проблеме, а не на регулярном выражении. –

+0

@matthew: если мы не знаем, что он вкладывает в набор, как узнать, имеет ли порядок вопрос? – SilentGhost

ответ

4
def sorted_paths(filename): 
    with open(filename) as f: 
     gen = (matches(line) for line in f) 
     s = set(match.group(1) for match in gen if match) 
    return sorted(s) 
+0

Если подходящая группа - это целая строка, я думаю, что два генератора могут быть объединены в один. –

+0

Ничего себе, теперь это изящное решение :-). – helpermethod

2

только если порядок не имеет значения (поскольку множества неупорядоченных), и если типы hashable (что строки).

+0

Извините, только что отредактировал исходный вопрос. – helpermethod

+0

Ответ по-прежнему сохраняется. –

0

Вы можете использовать словарь, чтобы сохранить свой путь.

from collections import defaultdict 
h=defaultdict(str) 
uniq=[] 
for line in open("file"): 
    if "pattern" in line: 
     # code to extract path here. 
     extractedpath= ...... 
     h[extractedpath.strip()] = "" #using dictionary to store unique values 
     if extractedpath not in uniq: 
      uniq.append(extractedpath) #using a list to store unique values 
+0

В чем смысл словаря здесь? Дик, где ключи неактуальны (устанавливается на какое-то фиктивное значение и никогда не используется) по существу является семантически неправильным, относительно неэффективным набором. – delnan

+0

словарь предназначен для хранения уникальных значений пути при итерации по файлу. Я мог бы также использовать список. – ghostdog74

+0

Как сказал @deinan, было бы более эффективно хранить пути в 'set', а не' dict', поскольку вы не используете соответствующие словари со значением, которые должны быть связанных с каждой клавишей (т. е. используемое значение '' '' фиктивного значения. Независимо от того, какую структуру данных вы используете, каждый словарь или элемент набора могут отображаться в контейнере только один раз, поэтому нет необходимости в обслуживании отдельного списка «uniq» - просто извлекайте все ключи словаря или задайте элементы в список после обработки все строки в файле. – martineau

0

Только вы должны иметь полные имена везде, и если вы в Windows, имена могут быть различные случаи, когда они не чувствительны к регистру. Также в Python вы также можете использовать/вместо \ (да: будьте осторожны, избегая обратных косых черт).

Если вы имеете дело с URL-адресами, большая часть времени domain.com, domain.com/, www.domain.com и http://www.domain.com означает то же самое, и вы должны позаботиться о том, как нормализовать.

+1

Какое отношение это имеет к вопросу? –

+0

набор требует точного ключа, одной буквенной формы, дополнительного пространства или/и т. Д., И вы получаете повторяющиеся записи. –

3

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

+2

Да, использование набора для удаления дубликатов становится общей идиомой Python, если элементы хешируются. Прежде чем они были введены в язык, словари с фиктивными значениями часто использовались вместо этого. – martineau

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