сколько раз имя присутствует в сообщении?Python 2.x - PullRequest
0 голосов
/ 04 марта 2019

ex из того, что text.txt выглядит

пт 8 августа

имя Фред @ всем привет, как дела

прочитано ДжорджемХанна Ирен

Пт Авг 8

имя Джордж @ Фред пока неплох, а вы

прочитано Фредом Ханна Ирен

Пт Авг 8

имя Ханна @ Фред немного устал

прочитано Фредом Джорджем Ирен

Сб 9 августа

имя Ирэн @ все, что вы, ребята, хотите сделать в выходные дни

прочитано Фредом Джорджем Ханна

Сб 9 августа

имя Фред @ Ирэн Я хочу покататься на коньках

прочитано Джорджем Ирэн

Сб 9 августа

имя Ирэн @ Фред Пойдем

прочитано Фредом Джорджем

Сб 9 августа

имя Фред @ ....

и т. Д. ... с дополнительными сообщениями

Итак, я получил эту часть своего кода

input

fhand = open('text.txt')

for line in fhand:
    line = line.rstrip()
    if not line.startswith('name ') : continue
    words = line.split()    
    output_name = word[1]
# which will give me just the BOLD names 

, но как мне продолжить и закончитькод, чтобы я мог присоединиться к выходу этих имен вместе?таким образом, печать будет в списке

DESIRED OUTPUT

['fred', 'george', 'hannah', 'irene', 'fred', 'irene' 'etc..']

с сохранением дублированных имен.append дает мне список без дублированного имени.

Как мне получить все выходные имена в списке?Не уверен, как определить список сгенерированных мной выходных имен.

Моя конечная цель - найти все имена и подсчитать, сколько раз они встречаются в файле text.txt.Я думал о создании списка имен, а затем подсчитывал их, но я не уверен, как создать этот список для подсчета.Я не хочу подсчитывать @name только имя от имени, выделенного жирным шрифтом.Сколько раз каждый человек отправил сообщение?

Желаемый окончательный результат

fred: 3 # or actual number times of occurrence / count
george: 1 # or actual number times of occurrence / count
hannah: 1 # or actual number times of occurrence / count
irene: 2 # or actual number times of occurrence / count

TRIED

список печати (output_name) дает мне

НЕ желаемый вывод

[ 'f', 'r', 'e', 'd']

....

это не то, что я хочу.

Заранее благодарю за помощь!простите за отсутствие правильного жаргона, я все еще начинающий программист на python.

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

Вы также можете сделать это, используя regex:

import re
from collections import Counter

with open('text.txt', 'r') as f:
    data = f.read()

results = Counter(re.findall('(\w+) @', data))
for name, value in results.items():
    print('{}: {}'.format(name, value))

Вывод:

fred: 2
george: 1
hannah: 1
irene: 2
0 голосов
/ 04 марта 2019

Вам нужно добавить количество в список:

fhand = open('text.txt')
names = [] # an empty list to hold the names
for line in fhand:
    line = line.rstrip()
    if not line.startswith('name ') : continue
    words = line.split()    
    names.append(word[1])

Теперь список names содержит имена.Для подсчета частот вы можете сделать следующее:

import collections
freq = collections.Counter(names)

Теперь freq будет объектом Counter, похожим на словарь, который будет содержать количество вхождений каждого имени.Например, freq['fred'] вернет количество вхождений имени 'fred'.

В качестве примечания я бы предложил не использовать continue, когда это возможно, - это делает код менее понятным.Вместо этого используйте if ... else:

fhand = open('text.txt')
names = [] # an empty list to hold the names
for line in fhand:
    line = line.rstrip()
    if line.startswith('name '):
        words = line.split()
        names.append(word[1])

Таким образом, ваш код делает ваше намерение («извлечение имен») намного понятнее.

, если вы сейчас хотите что-то сделать (т.е.печать) с частотой результатов, вы можете перейти по словарю:

for k, v in freq.items():
    print(k, v)

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

0 голосов
/ 04 марта 2019

Используйте словарь для подсчета вашего товара из списка

fhand = open('text.txt')
names=[]
for line in fhand:
    line = line.rstrip()
    if not line.startswith('name ') : continue
    words = line.split()    
    output_name = words[1]
    names.append(output_name)
# which will give me just the BOLD names 
L = ['apple','red','apple','red','red','pear']
allcount = {}
[allcount .__setitem__(item,1+allcount.get(item,0)) for item in names]
print(allcount )
0 голосов
/ 04 марта 2019

Вы всегда можете использовать list.count, например:

>>> ['fred', 'george', 'hannah', 'irene', 'fred', 'irene'].count('fred')
2

Или создать словарь при итерации:

counter = {}
for line in fhand:
    line = line.rstrip()
    if not line.startswith('name ') : continue
    words = line.split()    
    output_name = word[1]
    try:
        counter[output_name] += 1
    except KeyError:
        counter[output_name] = 1

Или использовать встроенную Counter:

>>> from collections import Counter
>>> Counter(['fred', 'george', 'hannah', 'irene', 'fred', 'irene'])
Counter({'fred': 2, 'irene': 2, 'george': 1, 'hannah': 1})

И наконец, для печати из dict:

for name, count in counter.items():
    print("{}: {}".format(name, count)
0 голосов
/ 04 марта 2019

Вы должны попытаться создать словарь и сохранить имена и количество раз, когда они встречаются.

    from collections import defaultdict
    fhand = open('text.txt')

    name_count = defaultdict(int)    
    for line in fhand:
        line = line.rstrip()
        if not line.startswith('name ') : continue
        words = line.split()    
#        output_name = word[1]
        name_count[words[1]] += 1

    print(name_count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...