Подсчет количества раз, когда первое слово в строке появляется при чтении из файла с исключениями - PullRequest
0 голосов
/ 24 мая 2018

Использование фиктивного файла (streamt.txt) со следующим содержимым:

andrew I hate mondays.
fred Python is cool.
fred Ko Ko Bop Ko Ko Bop Ko Ko Bop for ever
andrew @fred no it isn't, what do you think @john???
judy @fred enough with the k-pop
judy RT @fred Python is cool.
andrew RT @judy @fred enough with the k pop
george RT @fred Python is cool.
andrew DM @john Oops
john DM @andrew Who are you go away! Do you know him, @judy?

Первое слово каждой строки представляет пользователя, а остальная часть - это сообщение, похожее на твиттер.Мне нужно распечатать список лучших n (введенных пользователем) исходных пользователей (большинство сообщений) рядом с количеством отправленных ими сообщений.

Это не включает в себя никаких сообщенийс «RT» в начале.Отформатированный в выровненных столбцах в лексикографическом порядке в случае связей.

В моем нынешнем виде мой код находит только наиболее часто используемые слова в сообщениях и не исключает сообщения RT и DM или учетную запись для n:

file=open('streamt.txt')

counts=dict()
for line in file:
    words=line.split()
    for word in words:
    counts[word]=counts.get(word, 0)+1

lst=list()
for key,value in counts.items():
    new=(value, key)
    lst.append(new)

lst=sorted (lst, reverse=True)

for value, key in lst[:10]:
    print(value,key)

Это мой вывод:

6 Ko
5 @fred
4 andrew
3 you
3 is
3 cool.
3 RT
3 Python
3 Bop
2 with

Фактический вывод должен быть:

Enter n: 10
3 andrew
2 fred
1 john judy

Есть какие-нибудь идеи относительно того, как я должен это сделать?

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Это можно сделать эффективно, восстановив имя пользователя автора с помощью str.split и ведя счет с collections.Counter.

from collections import Counter

with open('streamt.txt', 'r') as file:
    count = Counter(line.split()[0] for line in file)

print(count) # Counter({'andrew': 4, 'fred': 2, 'judy': 2, 'george': 1, 'john': 1})

Если вы хотите, чтобы пользователи сортировались по номеру сообщения, вы можете использоватьCounter.most_common.Вы можете передать в качестве аргумента количество элементов, которые вы хотите вернуть.

print(count.most_common())
# prints:  [('andrew', 4), ('fred', 2), ('judy', 2), ('george', 1), ('john', 1)]

print(count.most_common(2))
# prints:  [('andrew', 4), ('fred', 2)]
0 голосов
/ 24 мая 2018

Вот полное решение, использующее только defaultdict в качестве импортируемого класса.Обратите внимание, что учитывается тот факт, что несколько пользователей могут иметь одинаковое количество сообщений:

from collections import defaultdict

n = int(input("Enter n: "))

# Build dictionary with key = name / value = number of messages
d = defaultdict(int)
with open('file.txt') as file:
    for line in file:
        words = line.split()
        if words[1] not in ["RT"]:
            d[words[0]] += 1

# Build dictionary with key = number of messages / value = list of names
d_new = defaultdict(list)
for k,v in d.items():
    d_new[v].append(k)

# Keep only the top n items in dictionary sorted by number of messages
listOfNbAndNames = sorted(d_new.items(), reverse = True)[:n]
for nb,names in listOfNbAndNames:
    print(nb, " ".join(names))
0 голосов
/ 24 мая 2018

Использование Counter:

from collections import Counter

with open(filename, "r") as f:
    for line in f:
        if 'DM' not in line and 'RT' not in line:
            words = line.split()
            lst.append(words[0])

for k, v in Counter(lst).items():
    print(v, k)

# 2 andrew
# 2 fred                                                     
# 1 judy                                                  
0 голосов
/ 24 мая 2018

Считать следующим образом:

#!/usr/bin/env python3.6
from collections import Counter, defaultdict
from pathlib import Path

def main():
    n = input('Enter n: ')
    try:
        n = int(n)
    except:
        print('Invalid input.')
        return
    ss = Path('streamt.txt').read_text().strip().split('\n')
    c = Counter([
        i.strip().split(' ', 1)[0] for i in ss
        if i.strip().split(' ', 2)[1] not in ('RT',)
    ])
    d = defaultdict(list)
    for k, v in c.most_common():
        d[v].append(k)
    print('\n'.join([f'{k} {" ".join(v)}' for k, v in list(d.items())[:n]]))

if __name__ == '__main__':
    main()

Вывод:

Enter n: 10
3 andrew
2 fred
1 judy john
0 голосов
/ 24 мая 2018

Использование сборов Модуль.

Демонстрация:

import collections
d = collections.defaultdict(int)
with open(filename, "r") as infile:
    for line in infile:
        if 'RT' not in line and 'DM' not in line:
            d[line.strip().split()[0]] += 1

d = sorted(d.items(), key=lambda x: x[1], reverse=True)
for k,v in d:
    print(v, k)

Вывод:

2 andrew
2 fred
1 judy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...