我正在尝试使用我编写的函数输出(dct)来解析字典,该函数用于分析收入和支出.csv文件。我将“金额”指定为交易总额。 dct创建一个返回以下内容的字典:
spending = {
'month': [],
'payee': [],
'amount': [],
'category': [],
}
下一个功能的目标是创建一个字典,对每个“类别”(仅汽车,房屋和食物)的所有“数量”输出求和。到目前为止,这是我的代码,并且可以正常工作。不过,我相信这并不是最Python的编写方式。有任何想法吗?
def summarize_by_category(dct):
car, home, food = 0, 0, 0
for (index,category) in enumerate( dct['category'] ):
if "car" in category:
car += dct['amount'][index]
elif "food" in category:
food += dct['amount'][index]
elif "home" in category:
home += dct['amount'][index]
Totals = {
'car': car,
'food': food,
'home': home,
}
return (Totals)
答案 0 :(得分:2)
不错,我可以说,但是您可以进行以下更改:
def summarize_by_category(dct):
Totals = {
'car': 0,
'food': 0,
'home': 0
}
for category, amount in zip(dct['category'], dct['amount']):
for key in Totals:
if key in category:
Total[key] += amount
return (Totals)
所以
Totals
字典中在这里,我假设您的类别类似于“约翰的美食”和“家庭实用程序”,如果您可以进行精确匹配,则应使用==
而不是in
进行匹配。
答案 1 :(得分:1)
我不确定您的dct
的结构-但这可能会有所帮助:
def summarize_by_category(dct):
Totals = {'car': 0, 'home': 0, 'food': 0}
for index, category in enumerate( dct['category'] ):
if "car" in category:
Totals['car'] += dct['amount'][index]
elif "food" in category:
Totals['food'] += dct['amount'][index]
elif "home" in category:
Totals['home'] += dct['amount'][index]
return (Totals)
取决于您的字典的结构,这也可能起作用:
def summarize_by_category(dct):
return {k: sum(v) for k, v in dct.items()}
答案 2 :(得分:1)
如果仅将类别用作字典中的键,则可以摆脱所有if/else
。
def summarize_by_category(dct):
totals = {}
for index, category in enumerate(dct['category']):
if category in totals:
totals[category] += dct['amount'][index]
else:
totals[category] = dct['amount'][index]
return totals
如果您只对某些类别感兴趣,则可以使用这些键初始化字典,并跳过创建新键的操作。
def summarize_by_category(dct):
totals = {'car': 0, 'home': 0, 'food': 0}
for index, category in enumerate(dct['category']):
if category in totals:
totals[category] += dct['amount'][index]
return totals
答案 3 :(得分:1)
您可以尝试这样的事情:
def summarize_by_category(dct):
Totals = {'car': 0, 'home': 0, 'food': 0}
for i in Totals.keys():
Totals[i] = sum([dct['amount'][index] for (index,category) in enumerate( dct['category'] ) if i in category ])
return Totals
或者,如果您想用更短的方法来做,可以尝试这样的事情:
def summarize_by_category(dct):
return {i:sum([dct['amount'][index] for (index,category) in enumerate( dct['category'] ) if i in category ]) for i in 'car,home,food'.split(',')}