Как подсчитать несколько входов в .txt, а не только один - PullRequest
0 голосов
/ 13 февраля 2020

Я нашел код, который подсчитывает список значений в файле .txt. Тем не менее, по какой-то причине это будет только первое значение, которое появляется. Поэтому, если файл имеет что-то вроде:

1
2
2
3
2
4

, тогда он будет печатать только:

Final Tally
1:1

The program will automatically shut down in 5 minutes.

Полный код:

    vote = input('Enter your vote: ')
    file = open('votedata.txt', 'a')
    file.write(vote + '\n')
    print('The system is adding your vote. The next person can vote in 3 seconds.')
    time.sleep(3)
    if vote == 'tally':
        break
#end of loop, beginning of tally
from collections import defaultdict
frequencies = defaultdict(int)
for number in open('votedata.txt'):
    frequencies[int(number)] += 1

for number in sorted(frequencies.keys()):
    print(' ')
    print('Final Tally:')
    print(number, ':', frequencies[number])
    print(' ')
    print('The program will automatically shut down in 5 minutes.')
    time.sleep(300)

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

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Хотя pandas работает, я думаю, это излишне для чего-то такого простого.

with open("votedata.txt") as fp:
    results = {}
    for row in fp:
        try:
          v = int(float(row))
          if v not in results:
            results[v] = 0
          results[v] += 1
        except:
          print("Invalid Numeric entry")

print( results )

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

1 голос
/ 13 февраля 2020

Pandas может сделать это для вас

df = pd.read_csv('votedata.txt', names=['votes'])
df['votes'].value_counts().to_dict()

{2: 3, 4: 1, 3: 1, 1: 1}

В вашем коде:

import pandas as pd

    vote = input('Enter your vote: ')
    file = open('votedata.txt', 'a')
    file.write(vote + '\n')
    print('The system is adding your vote. The next person can vote in 3 seconds.')
    time.sleep(3)
    if vote == 'tally':
        break

df = pd.read_csv('votedata.txt', names=['votes'])
frequencies = df['votes'].value_counts().to_dict()

for number in sorted(frequencies.keys()):
    print(' ')
    print('Final Tally:')
    print(number, ':', frequencies[number])
    print(' ')
    print('The program will automatically shut down in 5 minutes.')
    time.sleep(300)

0 голосов
/ 13 февраля 2020

Вы перебираете все выходные данные, поэтому через 5 минут вы получите второй результат:)

Вам просто нужно удалить отступ из трех последних строк.

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