2013-09-21 3 views
1

Я пытаюсь определить дисперсию длины значений параметров и напечатать значение дисперсии после набора соответствующих комбинаций параметров/значений.Определение дисперсии по длине

Например, значение дисперсии date в date=2007-04-14date=2007-08-19 и будет 0. Величина id_eve в id_eve=479989, id_eve=47 и id_eve=479 будет 2.88.

От Group values with common domain and page values у нас есть набор URL-адресов, которые анализируются для предоставления параметров/значений для набора URL-адресов.

Образец данных набор:

www.domain.com/page?id_eve=479989&adm=no 
www.domain.com/page?id_eve=47&adm=yes 
www.domain.com/page?id_eve=479 
domain.com/cal?view=month 
domain.com/cal?view=day 
ww2.domain.com/cal?date=2007-04-14 
ww2.domain.com/cal?date=2007-08-19 
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//support.domain.com/downloads/index.asp&unique=12345 
blog.news.org/news/calendar.php?view=day&date=2011-12-10 
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//.domain.com/downloads/index.asp&unique=12345 
blog.news.org/news/calendar.php?view=month&date=2011-12-10 

анализируется следующим кодом Python:

from collections import defaultdict 
from urllib import quote 
from urlparse import parse_qsl, urlparse 

urls = defaultdict(list) 
with open('links.txt') as f: 
    for url in f: 
     parsed_url = urlparse(url.strip()) 
     params = parse_qsl(parsed_url.query, keep_blank_values=True) 
     for key, value in params: 
      urls[parsed_url.path].append("%s=%s" % (key, quote(value))) 

# printing results 
for url, params in urls.iteritems(): 
    print url 
    for param in params: 
     print param 

Для обеспечения:

ww2.domain.com/cal 
date=2007-04-14 
date=2007-08-19 
www.domain.edu/some/folder/image.php 
l=adm 
y=5 
id=2 
page=http%3A//support.domain.com/downloads/index.asp 
unique=12345 
l=adm 
y=5 
id=2 
page=http%3A//.domain.com/downloads/index.asp 
unique=12345 
domain.com/cal 
view=month 
view=day 
www.domain.com/page 
id_eve=479989 
adm=no 
id_eve=47 
adm=yes 
id_eve=479 
blog.news.org/news/calendar.php 
view=day 
date=2011-12-10 
view=month 
date=2011-12-10 

Дополнительный кусок необходим для каждого параметра/value для печати изменения длины значений параметра для сопоставления параметров с аналогичным U RL, как определено в приведенном выше выпуске (надеюсь, что это ясно видно).

  • Параметры группы для группировки URLs
  • Вычислить длины значений параметров
  • Определить изменение длины

Таким образом, желаемый результат будет:

ww2.domain.com/cal 
date=2007-04-14 
date=2007-08-19 
0 
www.domain.edu/some/folder/image.php 
l=adm 
l=adm 
0 
y=5 
y=5 
0 
id=2 
id=2 
0 
page=http%3A//support.domain.com/downloads/index.asp 
0 
unique=12345 
0  
page=http%3A//.domain.com/downloads/index.asp 
unique=12345 
0 
domain.com/cal 
0 
view=month 
view=day 
1 
www.domain.com/page 
id_eve=479989 
id_eve=47 
id_eve=479 
2.88 
adm=no 
adm=yes 
0.25 
blog.news.org/news/calendar.php 
view=day 
view=month 
1 
date=2011-12-10 
date=2011-12-10 
0 
+0

Можете ли вы объяснить, почему ваш пример будет 2.88? –

ответ

3
from collections import defaultdict 
from urllib import quote 
from urlparse import parse_qsl, urlparse 

Нам нужно уметь вычислять разница:

def variance(values): 
    mean = sum(values)/float(len(values)) 
    return sum((elem - mean)**2 for elem in values)/float(len(values)) 

Мы хотим группе «ключ», так что вместо того, чтобы "%s=%s" мы собираемся добавить еще один слой в defaultdict.

urls = defaultdict(lambda: defaultdict(list)) 
with open('links.txt') as f: 
    for url in f: 
     parsed_url = urlparse(url.strip()) 
     params = parse_qsl(parsed_url.query, keep_blank_values=True) 
     for key, value in params: 
      urls[parsed_url.path][key].append(quote(value)) 

Тогда мы можем просто пройти и распечатать материал

for domain, keys in urls.items(): 
    print domain 
    for key, values in keys.items(): 
     for value in values: 
      print "%s=%s" % (key, value) 

     if len(values) > 1: 
      print variance(map(len, values)) 
Смежные вопросы