【问题标题】:Iterate through nested list and calculate the average values of elements遍历嵌套列表并计算元素的平均值
【发布时间】:2019-03-27 03:28:36
【问题描述】:

使用 Riot 的 API,我正在开发一个应用程序来分析来自玩家英雄联盟比赛历史的数据。


我有一个包含商品名称购买时间(以秒为单位)

的列表
item_list =
[['Boots of Speed', 50], 
['Health Potion', 60], 
['Health Potion', 80],
['Dorans Blade', 120],  
['Dorans Ring', 180], 
['Dorans Blade', 200], 
['Dorans Ring', 210]]

我正在尝试将其转换为包含商品名称平均购买时间唯一商品列表

对于这个例子,这就是我希望将我的列表转换成的内容:

['Boots of Speed', 50]
['Health Potion', 70]
['Dorans Blade', 160]
['Dorans Ring', 195]

我尝试的解决方案是创建一个空字典,遍历列表,将字典键设置为项目名称,将平均时间设置为键值。

dict = {}
for item in item_list:
    item_name = item[0]
    time_of_purchase = item[1]
    dict[item_name] = (dict[item_name] + time_of_purchase) / 2 # Would cast this as an integer

问题在于,我将尝试在变量 dict[item_name] 初始化之前对其执行计算。


此时我有点卡住了。任何指针或帮助将不胜感激。

【问题讨论】:

    标签: python iteration nested-lists


    【解决方案1】:

    你可以使用setdefault:

    item_list = [['Boots of Speed', 50],
                 ['Health Potion', 60],
                 ['Health Potion', 80],
                 ['Dorans Blade', 120],
                 ['Dorans Ring', 180],
                 ['Dorans Blade', 200],
                 ['Dorans Ring', 210]]
    
    result = {}
    for item, count in item_list:
        result.setdefault(item, []).append(count)
    
    print([[key, sum(value) / len(value) ] for key, value in result.items()])
    

    或者作为替代使用集合模块中的defaultdict

    from collections import defaultdict
    
    item_list = [['Boots of Speed', 50],
                 ['Health Potion', 60],
                 ['Health Potion', 80],
                 ['Dorans Blade', 120],
                 ['Dorans Ring', 180],
                 ['Dorans Blade', 200],
                 ['Dorans Ring', 210]]
    
    result = defaultdict(list)
    for item, count in item_list:
        result[item].append(count)
    
    print([[key, sum(value) / len(value) ] for key, value in result.items()])
    

    输出

    [['Dorans Blade', 160.0], ['Boots of Speed', 50.0], ['Health Potion', 70.0], ['Dorans Ring', 195.0]]
    

    【讨论】:

      【解决方案2】:

      我会先填写字典,对于每个item_name,我都会有一个time_of_purchase 值的列表。完成后,我将遍历字典 (key,list) 对,并计算每个列表的平均值。

      item_list = [['Boots of Speed', 50],
      ['Health Potion', 60],
      ['Health Potion', 80],
      ['Dorans Blade', 120],
      ['Dorans Ring', 180],
      ['Dorans Blade', 200],
      ['Dorans Ring', 210]]
      
      # Fill the dictionary
      d = {}
      for item in item_list:
          item_name, time_of_purchase = item
          if item_name not in d:
              d[item_name] = []
          d[item_name].append(time_of_purchase)
      
      # Now calculate and print the average
      retlist = []
      for item_name, list_of_times in d.items():
          new_entry = [
              item_name,
              sum(list_of_times) // len(list_of_times),
          ]
          retlist.append(new_entry)
      print retlist
      

      Daniel 的解决方案以更 Python 和高效的方式实现了相同的功能。

      【讨论】:

      • 虽然 Daniel 的解决方案很可能是高级程序员的首选,但作为新手,我更容易掌握和理解您的解决方案。谢谢!
      【解决方案3】:

      您的方法存在两个问题,一个是您确定的问题,一个是如果该项目出现 3 次,则平均值计算不正确。为了解决这个问题,一种方法是对时间求和,但也分别记录出现的次数,然后计算平均值作为第二步。

      item_list = [['Boots of Speed', 50],
      ['Health Potion', 60],
      ['Health Potion', 80],
      ['Dorans Blade', 120],
      ['Dorans Ring', 180],
      ['Dorans Blade', 200],
      ['Dorans Blade', 200],
      ['Dorans Blade', 200],
      ['Dorans Ring', 210]]
      
      item_dict = {}
      for item in item_list:
          item_name = item[0]
          time_of_purchase = item[1]
          if (item_name in item_dict):
              # Add the duplicate item in
              item_dict[item_name] = item_dict[item_name][0] + time_of_purchase, item_dict[item_name][1] + 1
          else:
              # First time recording this item
              item_dict[item_name] = (time_of_purchase, 1)
      
      for item_name in item_dict.keys():
          purchase_time = item_dict[item_name][0]
          purchase_count= item_dict[item_name][1]
          print("%-15s - %u" % (item_name, purchase_time/purchase_count))
      

      【讨论】:

        猜你喜欢
        • 2017-08-22
        • 1970-01-01
        • 2015-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多