【问题标题】:Calculate averages in Python nested list: if elements 1 and 2 match, average element 3在 Python 嵌套列表中计算平均值:如果元素 1 和 2 匹配,则平均元素 3
【发布时间】:2018-04-30 13:23:43
【问题描述】:

我正在尝试在不使用 Pandas 数据框或均值函数(用于练习)的情况下计算平均值。我有嵌套列表,如果第一个和第二个元素匹配,我想平均内部列表的第三个元素。

示例输入:

mylist = [[USD, 2000, 13.40], [USD, 2000, 13.68], [USD, 2001, 13.99], [EUR, 2000, 10.50], [EUR, 2000, 11.02]] 

想要的输出是:

avlist = [[USD, 2000, 13.54], [USD, 2001, 13.99], [EUR, 2000, 10.76]]

我得到的最远的是从前 2 个元素中创建一个集合并找到与原始列表的交集:

unique_list = list(set([x[0:2] for x in mylist]))
if (y for y in ([x[0:2] for x in mylist]) if y in unique_list):
   # av_list = 

是否可以执行类似“在此交集为真的情况下,将 my_list 中的第三个元素添加到 unique_list 中的第三个元素并除以添加的元素数”之类的操作?

我希望问题很清楚。

【问题讨论】:

  • 我认为你试图让你的代码太短。将其分解为许多小任务。首先列出货币-年份对。然后遍历该列表以查找原始列表中的匹配项。想想你可以使用哪些数据结构。

标签: python list average


【解决方案1】:

首先根据要用于控制平均的键对数据进行分组:

>>> mylist = [['USD', 2000, 13.40], ['USD', 2000, 13.68], ['USD', 2001, 13.99], ['EUR', 2000, 10.50], ['EUR', 2000, 11.02]] 
>>> from collections import defaultdict
>>> mydict = defaultdict(list)
>>> for curr, year, value in mylist:
        mydict[(curr,year)].append(value)

这将为您提供要平均为列表的数字:

>>> mydict
defaultdict(<type 'list'>, {('USD', 2000): [13.4, 13.68], ('USD', 2001): [13.99], ('EUR', 2000): [10.5, 11.02]})

然后平均每个列表:

>>> for (curr, year), values in mydict.items():
        print (curr, year, sum(values)/len(values))

USD 2000 13.54
USD 2001 13.99
EUR 2000 10.76

【讨论】:

    【解决方案2】:

    您可以创建一个字典,以您要匹配的项目为键,例如

    data = {}
    for item in mylist:
         key = tuple(item[0:2])
         values = data.get(key, [])
         values.append(item[2])
         data[key] = values
    
    # {('EUR', 2000): [10.5, 11.02], ('USD', 2000): [13.4, 13.68], ('USD', 2001): [13.99]}
    

    然后你可以遍历字典中的每个项目并计算你的平均值。

    for key in data:
         average = sum(data[key])/len(data[key])
         print('{}, average = {}'.format(key, average))
    

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 2018-03-19
      • 2021-12-03
      • 2018-02-18
      • 2013-06-07
      • 2013-07-22
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多