Как разделить список имен и оценок в Python? - PullRequest
0 голосов
/ 27 февраля 2020

Итак, у меня есть задание, в котором я должен посчитать оценки геймеров из текстового файла, а затем распечатать их. Как я могу разделить имя и счет и подсчитать счет для указанного c имени? И имена должны быть в алфавитном порядке.

Я пробовал это:

file = input("Enter the name of the score file: ")
    print("Contestant score:")
    open_file = open(file, "r")
    list = open_file.readlines()
    open_file.close()
    for row in sorted(list):
        row = row.rstrip()
        contestant = row.split(" ")
    if contestant[0] == contestant[0]:
        total = int(contestant[1]) + int(contestant[1])
        print(contestant[0], total)
    print(row)

пример текстового файла:

sophia 2

sophia 3

peter 7

matt 10

james 3

peter 5

sophia 5

matt 9

И программа должна выглядеть как это:

james 3

matt 19

peter 12

sophia 10

И мой текущий вывод:

sophia 10

sophia 5

Ответы [ 5 ]

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

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

Python 3

Код:

file = input("Enter the name of the score file: ")
print("Contestant score:")

gamer_dict = {}
with open(file, 'r') as infile:
    for row in infile:
        splits = row.split(" ")
        name = splits[0].strip()
        score = int(splits[1].strip())
        if name not in gamer_dict:
            gamer_dict[name] = score
        else:
            gamer_dict[name] += score

for k,v in sorted(gamer_dict.items()):
    print(k,v)

Выход:

Enter the name of the score file: gamers.txt
Contestant score:
james 3
matt 19
peter 12
sophia 10
0 голосов
/ 27 февраля 2020

Я бы предложил создать словарь:

# Open Text File
file = input("Enter the name of the score file: ")
print("Contestant score:")
open_file = open(file, "r")
lines = open_file.readlines()

# Convert into one single line for ease
mystr = '\t'.join([line.strip() for line in lines])

# Split it and make dictionary
out = mystr.split()
entries = dict([(x, y) for x, y in zip(out[::2], out[1::2])])

# Unsorted Display
print(entries)

# Sorted Display
print(sorted(entries.items(), key=lambda s: s[0]))

Вывод:

[('james', '3'), ('matt', '9'), ('peter', '5'), ('sophia', '5')]

Вы можете отображать / сохранять этот словарь в любой форме, например CSV, JSON или оставить его таким только.

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

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

from collections import defaultdict
scores=defaultdict(int)
with open('score.txt','r') as f:
    for line in f:
        if line.strip():
            key,val=line.split()
            scores[key]+=int(val)

print(*sorted(scores.items()),sep='\n')

Вывод:

('james', 3)
('matt', 19)
('peter', 12)
('sophia', 10)
0 голосов
/ 27 февраля 2020

Вы можете использовать что-то вроде:

import os
from collections import defaultdict
file = input("Enter the name of the score file: ").strip()
results = defaultdict(int)
if(os.path.isfile(file)):
    with open(file) as f:
        for row in sorted([x.strip() for x in list(f) if x]):
            line = row.split()
            if len(line) == 2:
                results[line[0]] += int(line[1])

        print("Contestants scores:")
        for k, v in results.items():
            print(k, v)
else:
    print("File not found", file)

Contestants scores:
james 3
matt 19
peter 12
sophia 10

демо

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

Вы можете использовать collections.defaultdict для этого.

Код:

from collections import defaultdict

file = input("Enter the name of the score file: ")
results = defaultdict(int)
with open(file, "r") as file:
    # Gather results from each line.
    for line in file:
        name, points = line.split()
        results[name] += int(points)

# Print the results dict.
print("Contestant score:")
for name in sorted(results.keys()):
    print(name, results[name])

Это работает для Python 3.

Выход:

Enter the name of the score file: input.txt
Contestant score:
james 3
matt 19
peter 12
sophia 10
...