【问题标题】:Get average for values in a list in a dictionary获取字典列表中值的平均值
【发布时间】:2020-08-31 03:43:14
【问题描述】:

我必须创建一个名为 read_data 的函数,该函数将文件名作为其唯一参数。然后,此函数必须打开具有给定名称的文件并返回一个字典,其中键是文件中的位置名称,值是读数列表。

第一个函数的结果起作用并显示:

{'Monday': [67 , 43], 'Tuesday': [14, 26], 'Wednesday': [68, 44], ‘Thursday’:[15, 35],’Friday’:[70, 31],’Saturday’;[34, 39],’Sunday’:[22, 18]}

名为 get_average_dictionary 的第二个函数将结构类似于 read_data 的返回值的字典作为其唯一参数,并返回具有与参数相同的键的字典,但具有读数的平均值而不是单个读数的列表.这必须返回:

{'Monday': [55.00], 'Tuesday': [20.00], 'Wednesday': [56.00], ‘Thursday’:[25.00],’Friday’:[50.50],’Saturday’;[36.50],’Sunday’:[20.00]}

但我无法让它工作。我收到以下错误:

line 25, in <module>
    averages = get_average_dictionary(readings)
line 15, in get_average_dictionary
    average = {key: sum(val)/len(val) for key, val in readings.items()}
AttributeError: 'NoneType' object has no attribute 'items'

这是我目前拥有的代码。任何帮助将不胜感激。

def read_data(filename):
    readings = {}

    with open("c:\\users\\jstew\\documents\\readings.txt") as f:
        for line in f:
            (key, val) = line.split(',')
            if not key in readings.keys():
                readings[key] = []

            readings[key].append(int(val))

    print(readings)

def get_average_dictionary(readings):
    average = {key: sum(val)/len(val) for key, val in readings.items()}

    print(average)


FILENAME = "readings.txt"

if __name__ == "__main__":
    try:
        readings = read_data(FILENAME)
        averages = get_average_dictionary(readings)


        # Loops through the keys in averages, sorted from that with the largest associated value in averages to the lowest - see https://docs.python.org/3.5/library/functions.html#sorted for details
        for days in sorted(averages, key = averages.get, reverse = True):
            print(days, averages[days])

【问题讨论】:

  • 您的read_data 不是return 任何东西,只是打印。所以readings = read_data(FILENAME)None
  • 我应该怎么做才能让它返回字典
  • 正如@Chris 所说,将print(readings) 更改为return readings
  • 或者添加return readings作为每个函数的最后一行,以防您希望它们同时打印和返回。不要忘记更改get_average_dictionary ;)
  • 实际上,我不认为这就是全部。我在下面提到了另外两个部分。

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

给定:

di={'Monday': [67 , 43], 'Tuesday': [14, 26], 'Wednesday': [68, 44], 'Thursday':[15, 35],'Friday':[70, 31],'Saturday':[34, 39],'Sunday':[22, 18]}

你可以这样做:

>>> {k:sum(v)/len(v) for k,v in di.items()}
{'Monday': 55.0, 'Tuesday': 20.0, 'Wednesday': 56.0, 'Thursday': 25.0, 'Friday': 50.5, 'Saturday': 36.5, 'Sunday': 20.0}

您遇到的错误似乎是您的函数没有返回任何内容。做吧:

def a_func(di):
    return {k:sum(v)/len(v) for k,v in di.items()}

你应该很高兴......

【讨论】:

  • 这不是问题。他的最后一个问题回答了你在做什么。这个问题是因为评论中的原因。
  • OP 的代码有average = {key: sum(val)/len(val) for key, val in readings.items()} 我认为可以肯定地说他们已经知道如何做到这一点。话虽如此,问题的标题具有误导性。
  • 我有时打字比阅读要快。感谢cmets。我修好了...
【解决方案2】:

你很接近,但至少有一个问题。一个是这样的:

Friday’:[50.50],’Saturday’;[36.50],’Sunday’: [22, 18]

注意“星期六”后面是分号,而不是冒号。在这两个例子中都是如此。另外,请注意您的文本颜色从红色变为蓝色。这通常(包括这种情况)意味着您从单引号切换到智能引号或看起来像普通引号但无法识别的字符。

{'Monday': [67 , 43], 'Tuesday': [14, 26], 'Wednesday': [68, 44], ‘Thursday’:[15, 35],’Friday’:[70, 31],’Saturday’;[34, 39],’Sunday’:[22, 18]}

一旦这些被清除,你只需要处理最后一部分,返回与打印结果。

def get_average_dictionary(readings):
    return {k:(sum(v)/len(v)) for (k,v) in vals.items()}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多