Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2015 16:52:08

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

К примеру есть текстовый файл следующего содержания:

'emails.txt'

These are latest emails from our partners:
From somebody@home.org Sat Jan 5 09:14:16 2015
From everybody@home.org Sun Feb 1 04:07:34 2015
From nobody@home.org Fri Mar 4 19:51:21 2015
From anybody@home.org Fri Apr 8 15:46:24 2015
From anybody@home.org Tue May 3 04:49:08 2015
From somebody@home.org Thu May 5 10:04:14 2015
From somebody@home.org Mon Jun 7 04:33:44 2015
From anybody@home.org Sun Jul 6 10:38:42 2015
From nobody@home.org Wed Aug 2 15:03:18 2015
From somebody@home.org Sat Aug 1 09:05:31 2015


А вот такой вывод я должна получить:

04 3
09 2
10 2
15 2
19 1


Т.е. необходимо отделить часы (slice) от метки времени, затем отсортировать кортежный список (sort) и вывести результат, который выше.

Здесь то, что смогла сделать:

name = raw_input("Enter file:")
if len(name) < 1 : name = "emails.txt"
handle = open(name)
times = dict()
for line in handle:
    line.strip()
    if not line.startswith("From ") : continue
    time = line.split()
    times[time[5]] = times.get(time[5],0) + 1
    
#print times.items()
   
for k, v in times.items():
    print k, v






Офлайн

#2 Авг. 5, 2015 17:23:30

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

from datetime import datetime
from collections import Counter
emails = open('emails', 'r').readlines()
dates = []
for item in emails:
    if not item.startswith("From"):
        continue
    date = item.strip().split(' ', maxsplit=2)
    dates.append(datetime.strptime(date[-1], '%c').hour)
for k, v in Counter(dates).most_common():
    print("{} : {}".format(k, v))

Офлайн

#3 Авг. 5, 2015 17:30:54

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

@ ayb

получаю Traceback:… Type Error: split() takes no keyword arguments

и для новичка мне многовато начала вроде
from datetime import datetime
from collections import Counter

ещё не проходила (

Офлайн

#4 Авг. 5, 2015 17:47:44

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

Значит замените на :

date = item.strip().split(' ', 2)

Abeille
и для новичка мне многовато начала вроде
from datetime import datetime
from collections import Counter

Так почитайте документацию. Если коротко : datetime модуль для работы с датой и временем, а Counter это подкласс словаря, для удобного подсчета элементов в хешируемых типах данных.

PS Вообще Вам там и не нужен модуль datetime. Можно записать даже вот так :

line = lambda x: x.strip().split(' ', 5)[-1].split(':')[0]
for k, v in Counter([line(x) for x in open('emails').readlines()
                     if x.startswith("From")]).most_common():
    print("{}: {}".format(k, v))

Отредактировано ayb (Авг. 5, 2015 18:21:58)

Офлайн

#5 Авг. 5, 2015 21:41:06

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

ayb
Можно записать даже вот так :
ayb
line = lambda x: x.strip().split(' ', 5).split(':')

заменяем на
line = x.split()[5][:2]
и
line(x) for x in open('emails')
В остатке получаем:
from collections import Counter
hour=lambda x: x.split()[5][:2]
with open('emails') as f:
    for v in Counter(hour(l) for l in f if l.startswith('From')).most_common(): print(*v)



Отредактировано Isem (Авг. 5, 2015 21:46:17)

Офлайн

#6 Авг. 5, 2015 21:42:25

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

@ayb

Спасибо.

Только я получаю не совсем тот результат:
3 04: 1
04: 1
2 15: 1
8 15: 1
и т.д.

А нужно это:

04 3
09 2
10 2
15 2
19 1


Мне нужны только часы и количество их повторов в файле и вывод именно в таком виде.

Отредактировано Abeille (Авг. 5, 2015 21:48:22)

Офлайн

#7 Авг. 5, 2015 21:47:37

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

@Isem

Итоговый код просто идеален!
Я ещё тупая, но всё исправила) (мне нужно было без двоеточия)

Огромное спасибо всем за помощь!





Отредактировано Abeille (Авг. 5, 2015 21:51:57)

Офлайн

#8 Авг. 5, 2015 21:48:50

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

Abeille
@Isemпоследний кусок почти идеалентолько как убрать двоеточия?
убрал



Офлайн

#9 Авг. 5, 2015 21:54:13

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка


Isem
убрал

да я просто измучилась и просто тоже уже невнимательная
посмотрела и убрала)

ещё раз спасибо)


Отредактировано Abeille (Авг. 5, 2015 21:54:26)

Офлайн

#10 Авг. 5, 2015 22:17:48

Abeille
Зарегистрирован: 2015-07-06
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

словари, кортежи, выборка и сортировка

на других подобных файлах не срабатывает

помучьтесь ещё по-простому, куда и что мне вписать, чтобы было так же красиво, как с предыдущим примером
обязательно (slice) и (sort)

снова тот же изначальный код без конкретного файла, но в котором точно такие же строки, как, например, вот эта From somebody@home.org Sat Jan 5 09:14:16 2015:

name = raw_input("Enter file:")
if len(name) < 1 : name = "*.txt"
handle = open(name)
times = dict()
for line in handle:
    line.strip()
    if not line.startswith("From ") : continue
    time = line.split()
    times[time[5]] = times.get(time[5],0) + 1
    
print times.items()
   
for k, v in times.items():
    print k, v

из заданного файла по своему коду я получаю вот это:

список таплов (не отображаются здесь) … …
и это:
09:14:16 1
18:10:48 1
16:10:39 1
15:46:24 1 … …


желаемый результат:

09 2
10 3
15 1 … …

Отредактировано Abeille (Авг. 5, 2015 22:20:35)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version