我正在做作业,但是我被困住了,不知道如何进行。
我需要从第一行(来自txt文件)的不同类别中选择不同的类别,并计算每个数值的平均值。当我在txt文件中添加新行时,该程序必须能够正常运行。
Category;currency;sellerRating;Duration;endDay;ClosePrice;OpenPrice;Competitive?
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Automotive/Game;US;3249;5;Mon;0,01;0,01;No
Music/Automotive/Game;US;3249;5;Mon;0,01;0,01;No
这是文本文件。我试图从中区分出不同的类别,但是我不知道我是否正确地做到了,以及如何让Python知道他必须从1组中计算所有数字。
with open('bijlage2.txt') as bestand:
maak_er_lists_van = [(line.strip()).split(';') for line in bestand]
keys = maak_er_lists_van[0]
lijst = list(zip([keys]*len(maak_er_lists_van[1:]),
maak_er_lists_van[1:]))
x = [zip(i[0], i[1]) for i in lijst]
maak_dict = [dict(i) for i in x]
for i in maak_dict:
categorieen =[i['Category'], i['currency'], i['sellerRating'],
i['Duration'], i['endDay'], i['ClosePrice'], i['OpenPrice'],
i['Competitive?']]
categorieen = list(map(int, categorieen))
这是我到目前为止所拥有的。我是Python初学者,所以整个文本文件对我来说是新的。有人可以帮助我或解释我需要做什么,以便我可以进一步从事该项目吗?提前非常感谢!
答案 0 :(得分:1)
这就是我要做的。我必须使用locale.atof()
进行添加,因为我在.
的位置用作小数点,而不是逗号。您可能必须按照指示进行更改。
csv
模块用于读取文件,并通过两步过程计算平均值。首先,将每个类别的值相加,然后,根据读取的值的数量计算每个类别的平均值。
import csv
import locale
from pprint import pprint, pformat
import locale
#locale.setlocale(locale.LC_ALL, '') # empty string for platform's default settings
# Following used for testing to force ',' to be considered as a decimal point.
locale.setlocale(locale.LC_ALL, 'French_France.1252')
avg_names = 'sellerRating', 'Duration', 'ClosePrice', 'OpenPrice'
averages = {avg_name: 0 for avg_name in avg_names} # Initialze.
# Find total of each category of interest.
num_values = 0
with open('bijlage2.txt', newline='') as bestand:
csvreader = csv.DictReader(bestand, delimiter=';')
for row in csvreader:
num_values += 1
for avg_name in avg_names:
averages[avg_name] += locale.atof(row[avg_name])
# Calculate average of each summed value.
for avg_name, total in averages.items():
averages[avg_name] = total / num_values
print('raw results:')
pprint(averages)
print() # Formatted output
print('Averages:')
for avg_name in avg_names:
rounded = locale.format_string('%.2f', round(averages[avg_name], 2),
grouping=True)
print(' {:<13} {:>10}'.format(avg_name, rounded))
输出:
raw results:
{'ClosePrice': 0.01, 'Duration': 5.0, 'OpenPrice': 0.01, 'sellerRating': 3249.0}
Averages:
sellerRating 3 249,00
Duration 5,00
ClosePrice 0,01
OpenPrice 0,01
答案 1 :(得分:0)
一切都很好,您可以通过这种方式读取文件并创建包含类别和值的字典imo。您的列表maak_dict
每行包含一个字典。要计算一个类别的平均值,您可以执行以下操作:
def calc_average(categ):
values = [i[categ] for i in maak_dict]
average = sum(values)/len(values)
return average
假设您要计算平均值。 categ
必须是字符串。
之后,您可以创建一个包含所有平均值的新字典:
new_dict = {}
for category in maak_dict[0].keys():
avg = calc_average(category)
new_dict[category] = avg