#python #python_3x
Доброго времени суток. Возник вопрос. Есть файл отфильтрованный из лога почтового сервера: gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com Ожидаемый результат: {gpk@site.com { 16745165214@kdf.net : 3 kglk@mail.ru : 3 kjl@list.ru : 3 ncv@gmail.com : 3 } } пишу код: которое должен почитать кто куда сколько раз отправил. #! /usr/bin/env python3.6 # -*- coding: utf-8 -*- def reader(fname): d={} fromto={} df=[] file = open(fname,"r") for line in file: # print (line) ll=line.strip().split('for') sfrom=''.join(ll[0].split()) sto=ll[1].split() if sfrom in fromto: # почему-то проверка не рботает df = fromto[sfrom] for i in range(len(sto)): df.append(sto[i]) fromto[sfrom]= df df.clear() print(fromto) if __name__ == '__main__': reader('list-100.list')
Ответы
Ответ 1
Проще разделять строку не по "for", а сразу по пробелам, и игнорировать второй элемент массива, который содержит "for". Если необходимо еще и посчитать кто кому сколько раз отправил, то можно сделать так: from collections import Counter log = """\ gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk2@site.com for 7167451652142@kdf.net kglk2@mail.ru lkjl2@list.ru ncv2@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com """ pairs = Counter() for line in log.splitlines(): tmp = line.split() from_user = tmp[0] pairs.update((from_user, to_user) for to_user in tmp[2:]) print(pairs) В итоге для каждой пары (Отправитель, Получатель) мы имеем число отправленных сообщений. UPD: При необходимости последующего вывода, сгруппированного по отправителю, можно использовать другой метод: from collections import defaultdict, Counter base = defaultdict(Counter) log = """gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com gpk2@site.com for 7167451652142@kdf.net kglk2@mail.ru lkjl2@list.ru ncv2@gmail.com gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com """ for line in log.splitlines(): tmp = line.split() from_user = tmp[0] base[from_user].update(tmp[2:]) и распечатка будет выглядеть следующим образом: for from_user, msgs in base.items(): print("{0}:".format(from_user)) for to_user, count_messages in msgs.items(): print(" {0}: {1}".format(to_user, count_messages)) Вывод консоли: gpk@site.com: 716745165214@kdf.net: 2 kglk@mail.ru: 2 lkjl@list.ru: 2 ncv@gmail.com: 2 gpk2@site.com: 7167451652142@kdf.net: 1 kglk2@mail.ru: 1 lkjl2@list.ru: 1 ncv2@gmail.com: 1Ответ 2
text = """\ 1. gpk@site.com for 716745165214@kdf.net kglk@mail.ru lkjl@list.ru ncv@gmail.com 2. abc@site.com for site@site.ru lkjl@list.com """ from collections import defaultdict from_by_to_list = defaultdict(list) for line in text.splitlines(): line = line.strip() from_str, to_str = line.split('for') from_str = from_str.strip().split()[1] to_list = to_str.strip().split() from_by_to_list[from_str] += to_list print(from_by_to_list) print() for k, items in from_by_to_list.items(): print('{} ({}):'.format(k, len(items))) for i, x in enumerate(items, 1): print(' {}. {}'.format(i, x)) print() Консоль: defaultdict(, {'gpk@site.com': ['716745165214@kdf.net', 'kglk@mail.ru', 'lkjl@list.ru', 'ncv@gmail.com'], 'abc@site.com': ['site@site.ru', 'lkjl@list.com']}) gpk@site.com (4): 1. 716745165214@kdf.net 2. kglk@mail.ru 3. lkjl@list.ru 4. ncv@gmail.com abc@site.com (2): 1. site@site.ru 2. lkjl@list.com
Комментариев нет:
Отправить комментарий