Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2015 22:38:10

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

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

вместо

for k, v in times.items(): ....
надо (если ручками все)
w = {}
for k, v in times.items():
    k = k[:2]
    if k in w: w[k]+=1
    else: w[k] = 1
for p in sorted(w, key = lambda x: -w[x]): print(p, w[p])



Офлайн

#2 Авг. 5, 2015 23:36:25

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

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

Вот такой вариант без импортов:

f=  open('c:\\emails.txt')
f.readline() #пропускаем заголовок
hours = {}
for line in f.readlines(): #читаем остальное
   hour = line.split(' ')[5:6][0].split(':')[0] #магия - получам часы (думаю разберешься)
   if hour in hours:
       hours[hour] += 1 # если было, прибавляем количество на 1
   else:
       hours[hour] = 1 # если небыло, заводим, с количеством = 1
to_be_sorted = []
for val in hours:
    to_be_sorted.append((hours[val],val)) # загоняем из словаря в список (в перевернутом виде - количестово первое)
to_be_sorted.sort() #сортируем
for i in xrange(len(to_be_sorted)):
    print to_be_sorted[len(to_be_sorted)-i-1][1],to_be_sorted[len(to_be_sorted)-i-1][0] #вот тут печатаем в обратном порядке, вижу что некрасивое г, но фантазии щас не хватает (зато работает :)))

Отредактировано Iskatel (Авг. 5, 2015 23:37:47)

Офлайн

#3 Авг. 6, 2015 02:12:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

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

>>> import re
>>> import collections
>>> 
>>> 
>>> import io
>>> 
>>> text = u"""
... 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
... """
>>> 
>>> fp = io.StringIO(text)
>>> 
>>> 
>>> def skipn(it, n):
...     for _ in range(n):
...         next(it, None)
...     return it
... 
>>> def getf(s, pat):
...     match = re.search(pat, s)
...     return match and match.group(1)
... 
>>> 
>>> def clean_stream(s):
...     return skipn(s, 2)
... 
>>> def get_hours(seq):
...     pat = r' (\d{2}):\d{2}:\d{2} \d{4}$'
...     return tuple(getf(i, pat) for i in seq)
... 
>>> def count_repeats(seq):
...     return tuple(collections.Counter(seq).items())
... 
>>> def sort_first(seq):
...     return sorted(seq, key=lambda i: int(i[0]))
... 
>>> def f(fp):
...     seq = sort_first(count_repeats(get_hours(clean_stream(fp))))
...     for h, n in seq:
...         print h, n
... 
>>> f(fp)
04 3
09 2
10 2
15 2
19 1
>>> 

Add
Отсортировал по часам.



Отредактировано py.user.next (Авг. 11, 2015 01:04:48)

Офлайн

#4 Авг. 10, 2015 14:36:56

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

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

Isem
вместо

Так мне понятнее и срабатывает и на других подобных файлах.
Одна загвоздка в порядке конечной сортировки.
В примере я приводила emails.txt, результат после использования Вашего кода смотрите под ним.

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
w = {}
for k, v in times.items():
    k = k[:2]
    if k in w: w[k]+=1
    else: w[k] = 1
for p in sorted(w, key = lambda x: -w[x]): print p, w[p]

вывод на экране:

04 3
10 2
09 2
15 2
19 1

а мне принципиально необходима сортировка по часам, т.е.:

04
3
09 2
10 2
15 2
19 1

Где и что мне переставить в коде?

Отредактировано Abeille (Авг. 10, 2015 14:42:34)

Офлайн

#5 Авг. 12, 2015 01:53:04

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

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

Всем протянувшим руку помощи, большущее спасибо!
Вариантов тьма, учись - не хочу )


А вот так в результате я оформила свой простенький код:

name = raw_input("Enter file:")
if len(name) < 1 : name = "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"""
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
w = {}
for k, v in times.items():
    k = k[:2]
    if k in w: w[k]+=1
    else: w[k] = 1
s = sorted(w.keys())
for key in s:
    print key, w[key]

и получила, что требовалось:

04 3
09 2
10 2
15 2
19 1

Отредактировано Abeille (Авг. 12, 2015 01:55:03)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version