Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2012 12:10:09

suord
От:
Зарегистрирован: 2012-02-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно зделать

С питоном только начал разбиратся. Подскажите правельной алгоритм для задачи
В file.txt есть домены, каждий с новой строки.
Нужно подсчитать сколько раз попадается каждий домен. И вивесть результат упорядочен от самого популярного.
В какую сторону копать.



Офлайн

#2 Фев. 4, 2012 12:21:11

suord
От:
Зарегистрирован: 2012-02-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно зделать

можно сказать что сколько раз попадается каждая строка



Офлайн

#3 Фев. 4, 2012 13:23:00

FireOwl
От:
Зарегистрирован: 2011-12-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно зделать

f = open('input.txt','r')
dict = {}
for line in f.readlines():
if line[-1:] == '\n': l = line[:-1]
else: l = line
if l in dict: dict[l] += 1
else: dict[l] = 1
f.close()
f = open('output.txt','w')
for item in sorted(dict, key=lambda x: int(dict[x]), reverse=True):
f.write(item+' '+str(dict[item])+'\n')
f.close()
p.s. "правильно сделать“, ”правильный“, ”каждый“, ”вывести"… Копать в сторону правописания. ;)



Офлайн

#4 Фев. 4, 2012 13:57:48

suord
От:
Зарегистрирован: 2012-02-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно зделать

FireOwl
спасибо большое



Офлайн

#5 Фев. 4, 2012 14:05:42

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

как правильно зделать

FireOwl
Зачем людей плохому учишь?
Что за переменная dict?? Зачем эти танцы с обрезанием перевода строки?

Офлайн

#6 Фев. 4, 2012 14:40:41

Singularitty
От:
Зарегистрирован: 2012-02-02
Сообщения: 61
Репутация: +  5  -
Профиль   Отправить e-mail  

Офлайн

#7 Фев. 4, 2012 14:48:26

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

как правильно зделать

Как-то так:

#!/usr/bin/env python
#coding: utf8

import sys
from collections import Counter

TEST_DATA='''test0
test0
test0
test1
test2
test2
'''.splitlines()

def process_data(iterable):
cnt = Counter()
for item in iterable:
cnt[item]+=1
return cnt

def read_file(name):
with open(name) as fd:
lines = filter(bool,\
map(lambda a: a.strip(), fd))
return lines

def main(args):
data = read_file(args[1]) if len(args) == 2 \
else TEST_DATA
stat = process_data(data)

print '\n'.join(map(lambda a: '%d: %s' % (a[1], a[0]),\
sorted(stat.items(), key=lambda a: a[1], reverse=True)))
return 0

sys.exit(main(sys.argv))

Офлайн

#8 Фев. 4, 2012 15:48:44

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

как правильно зделать

Я чего-то не понимаю? Вроде задача соответствует примеру из документации.
http://docs.python.org/library/collections.html

from collections import Counter
l=[i.strip() for i in open("a.dat")]
print Counter(l).most_common(len(l))



Офлайн

#9 Фев. 4, 2012 16:07:53

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

как правильно зделать

doza_and
Я чего-то не понимаю?
Свой велосипед-то лучше )

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version