2013-09-11 4 views
-3

Я хотел бы напечатать количество уникальных строковых значений, длину символов и соответствующую строку. Python в порядке, но я предлагаю использовать другие инструменты. Если требуется конкретный вывод, работала бы табуляция, разделенная или аналогичная, которая может быть легко проанализирована. Это продолжение до Parsing URI parameter and keyword value pairs.Группировка и подсчет уникальных строковых значений и длин

Пример Источник:

date=2012-11-20 
test= 
y=5 
page=http%3A//domain.com/page.html&unique=123456 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
test= 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
y=5 
page=http%3A//support.domain.com/downloads/index.asp 
page=http%3A//support.domain.com/downloads/index.asp 
view=month 
y=5 
y=5 
y=5 

Пример вывода:

5 3 y=5 
3 78 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
2 52 page=http%3A//support.domain.com/downloads/index.asp 
2 5 test= 
1 15 date=2012-11-20 
1 10 view=month 

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

$ sort test | uniq -c | sort -nr 
     5  y=5 
     3  refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
     2  test= 
     2  page=http%3A//support.domain.com/downloads/index.asp 
     1  view=month 
     1  page=http%3A//domain.com/page.html&unique=123456 
     1  date=2012-11-20 
+0

Принимая во внимание ваш предыдущий ответ, который вы используете на http://stackoverflow.com/questions/18726136/parsing-uri-parameter-and-keyword-value-pairs, также находится в Python ... Возможно, он имеет было полезно предоставить ссылку на этот вопрос для обеспечения контекста. Поскольку было бы немыслимо, чтобы вы могли сделать это все в одном процессе ... –

+1

@JonClements Это продолжение этого вопроса, но я придумал дополнительные требования. Обновление вопроса со ссылкой на исходный вопрос. – Astron

ответ

1

Да, вы можете легко сделать это с помощью Python. Обычно люди склонны использовать словарь, чтобы держать след дублей

>>> from collections import defaultdict 
>>> group = defaultdict(list) 
>>> with open("test.txt") as fin: 
    for line in fin: 
     group[len(line.rstrip())].append(line) 
>>> for k, g in group.items(): 
    print k, len(g), g[0].strip() 


3 5 y=5 
5 2 test= 
10 1 view=month 
78 3 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
15 1 date=2012-11-20 
48 1 page=http%3A//domain.com/page.html&unique=123456 
52 2 page=http%3A//support.domain.com/downloads/index.asp 

Вместо если вы хотите, чтобы имитировать то, что вы раскошеливаться командами, подобная вещь может быть достигнута с помощью itertools.groupby, который работает аналогично uniq

>>> with open("test.txt") as fin: 
    file_it = (e.rstrip() for e in fin) 
    for k, g in groupby(sorted(file_it, key = len), len): 
     first_elem = next(g).strip() 
     print k, sum(1 for _ in g) + 1, first_elem 


3 5 y=5 
5 2 test= 
10 1 view=month 
15 1 date=2012-11-20 
48 1 page=http%3A//domain.com/page.html&unique=123456 
52 2 page=http%3A//support.domain.com/downloads/index.asp 
78 3 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
+0

Глядя на ваш выход, длина вывода кажется неправильной, начиная со второй строки? Кажется, что для каждой позиции подсчитывается дополнительный символ. – Astron

+0

@Aston: в новой строке добавлен дополнительный символ, я обновил ответ, чтобы отразить рассмотрение новой строки. – Abhijit

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