Добавить в словарь и подсчитать строки в файле на основе определенных условий - PullRequest
0 голосов
/ 25 мая 2018

Программа, которую я пытаюсь создать, должна взять файл (фиктивный файл, например, stream.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» обозначает ретвит, а «DM» обозначает прямое сообщение.

Программа должна напечатать пользователя сбольшинство ретвитов ( не пользователь, который ретвитает больше всего ) рядом с количеством ретвитов, которые накопил пользователь.

n должно основываться на количестве пользователей, что означает, что если естьпри этом будет напечатано меньше n строк, так как будет два пользователя с одинаковым числовым значением.Решение для фиктивных данных, приведенных выше, будет следующим:

Enter n: 10
2 fred
1 judy

Код, который у меня сейчас есть:

#define libraries used, counter, dictionary, and file path
from collections import Counter, defaultdict
from pathlib import Path

def main():
    #define n as user input, can only be an integer
    n = input('Enter n: ')
    try:
        n = int(n)
    except:
        print('Invalid input.')
        return
    #Open file from path, read line by line and remove whitespace characters
    ss = Path('stream.txt').read_text().strip().split('\n')
    #Count tweets and add to dictionary, strip spaces and tabs, separate tweets from retweets
    c = Counter([
        i.strip().split(' ', 1)[0] for i in ss
        if i.strip().split(' ', 2)[1] in ('RT @ ')

    ])
    d = defaultdict(list)
    #Formatting
    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]]))

#runs main
if __name__ == '__main__':
    main()

Однако это дает вывод:

Enter n: 10
1 judy andrew george

Я новичок в Python и не знаю, как продвинуться с этого момента.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Отладочная версия вашего кода:

from collections import Counter, defaultdict
from pathlib import Path

def main():
    #define n as user input, can only be an integer
    n = input('Enter n: ')
    try:
        n = int(n)
    except:
        print('Invalid input.')
        return
    #Open file from path, read line by line and remove whitespace characters
    ss = Path('stream.txt').read_text().strip().split('\n')
    #Count tweets and add to dictionary, strip spaces and tabs, separate tweets from retweets
    c = Counter([
        i.strip().split(' ', 3)[2][1:] for i in ss
        if i.strip().split(' ', 2)[1] in ('RT @ ')

    ])
    d = defaultdict(list)
    #Formatting
    for k, v in c.most_common():
        d[v].append(k)
    counts = list(d.keys())
    persons = list(d.values())
    print_str = '\n'.join(["%d %s" %(counts[i],' '.join(persons[i])) for i in range(len(counts))])
    print(print_str)

#runs main
if __name__ == '__main__':
    main()

ПРИМЕЧАНИЕ: Вы печатали пользователя, который ретвитил больше всего, вместо того, чтобы печатать пользователя с наибольшим количеством ретвитов.

Просто нужно отредактировать эту строку:

c = Counter([
    i.strip().split(' ', 3)[2][1:] for i in ss
    if i.strip().split(' ', 2)[1] in ('RT @ ')
0 голосов
/ 25 мая 2018
#!/usr/bin/env python
import os

# Return tweeted user if a tweet is a retweet
def get_tweeted_user(tweet):
    index = tweet.find(" RT ")
    if index < 0:
        return None
    contents = tweet.split(' ')
    if len(contents) < 2 or contents[1] != "RT" or contents[2][0] != '@':
        return None
    return contents[2][1:]

# Return top users, a list like [(2,'fred'), (1,judy)]
def top_users(file_path="stream.txt", n=2):
    users_map = {}
    if not os.path.exists(file_path):
        return None
    with open(file_path, 'r') as lines:
        for line in lines:
            user = get_tweeted_user(line)
            if user:
                # Update users_map
                if users_map.has_key(user):
                    users_map[user] += 1
                else:
                    users_map[user] = 1
    # Sort users_map using tweeted times
    users = sorted(users_map.items(), key=lambda x:x[1], reverse=True)

    # Return top n users
    return users[:n]


if __name__ == "__main__":
    tus = top_users()
    print tus
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...