Каждый из этих вызовов:
CalledStatistics['CountryCode'] = {'CallDuration', 'CallPrice', 'NumberOfTimesCalled'}
будет перезаписывать вызов раньше.
Для того, чтобы рассчитать сумму, которую вам нужно, вы можете использовать опцию dicts. Как в цикле for, где у вас есть данные в этих переменных: country_code, call_duration, call_price и где вы будете хранить данные в собранной_статистике: (EDIT: добавлена первая строка, чтобы превратить call_price в 0, если она записана как None в данных, этот фрагмент кода предназначен для работы с согласованными данными, например, целыми числами, если есть, возможно, другие типы данных, их нужно преобразовать в целые числа [или любые числа того же типа], прежде чем python сможет их суммировать)
call_price = call_price if call_price != None else 0
if country_code not in collected_statistics:
collected_statistics[country_code] = {'CallDuration' : [call_duration],
'CallPrice' : [call_price]}
else:
collected_statistics[country_code]['CallDuration'] += [call_duration]
collected_statistics[country_code]['CallPrice'] += [call_price]
и после цикла, для каждого COUNTRY_CODE:
number_of_times_called[country_code] = len(collected_statistics[country_code]['CallDuration']
total_call_duration[country_code] = sum(collected_statistics[country_code]['CallDuration'])
total_price[country_code] = sum(collected_statistics[country_code]['CallPrice'])
ОК, так что, наконец, вот полный УНР
#!/usr/bin/env python3
import csv
import decimal
with open('CalledData', newline='') as csvfile:
csv_r = csv.reader(csvfile, delimiter=',', quotechar='|')
# btw this creates a dict, not a set
collected_statistics = {}
for row in csv_r:
[country_code, number_called, call_price, call_duration] = row
# Only to avoid the first line, but would be better to have a list of available
# (and correct) codes, and check if the country_code belongs to this list:
if country_code != 'CountryCode':
call_price = call_price if call_price != 'None' else 0
if country_code not in collected_statistics:
collected_statistics[country_code] = {'CallDuration' : [int(call_duration)],
'CallPrice' : [decimal.Decimal(call_price)]}
else:
collected_statistics[country_code]['CallDuration'] += [int(call_duration)]
collected_statistics[country_code]['CallPrice'] += [decimal.Decimal(call_price)]
for country_code in collected_statistics:
print(str(country_code) + ":")
print("number of times called: " + str(len(collected_statistics[country_code]['CallDuration'])))
print("total price: " + str(sum(collected_statistics[country_code]['CallPrice'])))
print("total call duration: " + str(sum(collected_statistics[country_code]['CallDuration'])))
используя CalledData как файл, имеющий тот же контент, при условии, что выводит:: король обработки примера вы дали сценарий
$ ./test_script
BS:
number of times called: 2
total price: 0.40500
total call duration: 30
US:
number of times called: 4
total price: 0.03750
total call duration: 54
В чем вопрос? У вас есть словарь, и каждый раз, когда вы читаете CSV, код страны всегда будет перезаписываться, поэтому вы получите ключ с ключами (BS, US) и значения = самая последняя запись, т. Е. Перезаписанные данные. – Seekheart
Вы действительно хотите назначить набор 'CalledStatistics ['CountryCode']'? – MattDMo
В словаре KEY - это уникальное значение, поэтому да, сделав его таким образом, он перепишет VALUE. Вы просто назначаете новое VALUE уже существующему KEY (US). – catalesia