【问题标题】:How to find the average value from a list of tuples that share the same key?如何从共享相同键的元组列表中找到平均值?
【发布时间】:2020-06-21 23:09:18
【问题描述】:

我有两个从用户输入创建的列表,我使用以下代码将它们组合成一个元组列表:

daily_hours_list = [4, 2, 1, None, 3, 5]
week_counter_list = [1, 1, 1, 2, 2, 2]

weekly_hours_list = []
for week, time in zip(week_counter_list, daily_hours_list):
    if time != None:
        weekly_hours_list.append((week, t))

这给了我:

weekly_hours_list = [(1, 4),
                     (1, 2),
                     (1, 1),
                     (2, 3),
                     (2, 5)]

然后我使用此代码将第 1 周的所有小时数和第 2 周的所有小时数相加:

tup_h = {i:0 for i, v in weekly_hours_list}
for key, value in weekly_hours_list:
    tup_h[key] = tup_h[key]+value
weekly_sum_hours = list(map(tuple, tup_h.items()))

给我:

weekly_sum_hours = [(1, 6),
                    (2, 8)]

这一切都很好,但我如何找到每周的平均小时数,例如:

weekly_average_list = [(1, 2),
                       (2, 4)]

我想我需要扩展 for 循环计算,考虑周值为 1 和 2 的元组的计数,但不知道如何实现。提前感谢您的帮助。

【问题讨论】:

    标签: python-3.x list tuples user-input


    【解决方案1】:

    我认为首先收集每周的小时数会有所帮助。这可以通过字典轻松完成,其中键是周数,值是该周的小时列表。在内置的collections 模块中有一个称为defaultdict 的数据结构,它正是为这样的情况而设计的:

    from collections import defaultdict
    from statistics import mean
    
    daily_hours_list = [4, 2, 1, None, 3, 5]
    week_counter_list = [1, 1, 1, 2, 2, 2]
    
    daily_hours_by_week = defaultdict(list)
    for week, time in zip(week_counter_list, daily_hours_list):
        if time is not None:
            daily_hours_by_week[week].append(time)
    
    sum_hours_by_week = {w: sum(hours) for w, hours in daily_hours_by_week.items()}
    avg_hours_by_week = {w: mean(hours) for w, hours in daily_hours_by_week.items()}
    

    在我们的示例中,这意味着您不必为每个周数使用一个空列表来初始化字典(这就是您对 tup_h 的初始总和 0 所做的)。相反,如果我们尝试将一个小时附加到字典中尚未包含的一周,它将创建一个空列表放在该键下,然后附加到该键。

    一旦我们像这样安排每周的工作时间,就很容易对它们进行其他处理。

    我们实际上可以一次完成最后两行,并创建一个带有每周统计数据元组的字典:

    statistics_by_week = {w: sum(hours), mean(hours) for w, hours in daily_hours_by_week.items()}
    

    在此处阅读有关defaultdict 的更多详细信息:https://docs.python.org/3/library/collections.html#collections.defaultdict

    【讨论】:

    • 完美运行。感谢您的回答。
    • 不客气! ? 顺便说一句,我认为您设置tup_h 的初始总和为0 非常巧妙,因此您可以直接添加。当我在回答中提到它时,它的目的是鼓励“您已经在按照这些思路思考”,而不是“您为什么不使用正确的数据结构”。您几乎已经掌握了巧妙地解决问题的关键见解,只是您不知道可以为您完成繁重工作的数据结构。很高兴向您介绍它 - defaultdict 是一个非常有用的知识。
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多