在for循环中制作字典的Pythonic方法

时间:2020-06-10 01:09:38

标签: python dictionary

我正在尝试使用我编写的函数输出(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)

4 个答案:

答案 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(',')}
相关问题