按类型有效地汇总项目

诺塔布里克

我有一个项目与属性的列表"Type""Time"我想快速总和每个时间"Type"和追加到另一个列表。该列表如下所示:

Items = [{'Name': A, 'Type': 'Run', 'Time': 5},  
          {'Name': B, 'Type': 'Walk', 'Time': 15},  
          {'Name': C, 'Type': 'Drive', 'Time': 2},
          {'Name': D, 'Type': 'Walk', 'Time': 17},  
          {'Name': E, 'Type': 'Run', 'Time': 5}]

我想做这样的事情:

Travel_Times=[("Time_Running","Time_Walking","Time_Driving")]
Run=0
Walk=0
Drive=0    

for I in Items:
    if I['Type'] == 'Run':
       Run=Run+I['Time']
    elif I['Type'] == 'Walk': 
       Walk=Walk+I['Time']           
    elif I['Type'] == 'Drive': 
       Drive=Drive+I['Time']           

Travel_Times.append((Run,Walk,Drive))    

随着Travel_Times最后看起来像这样:

print(Travel_Times)
[("Time_Running","Time_Walking","Time_Driving")
 (10,32,2)]

这似乎应该很容易通过列表理解或类似于的方式高效地完成collections.Counter,但是我无法弄清楚。我认为最好的方法是对每个“类型”使用单独的列表理解,但这需要反复遍历列表。对于如何加快速度的任何想法,我将不胜感激。

谢谢

埃里克·杜米尼尔

请注意,大小写在Python中非常重要:

  • For 不是有效的声明
  • Travel_times 与...不同 Travel_Times
  • 没有:以后elif
  • Travel_Times.append(... 有一个领先的空间,这使Python感到困惑
  • items[太多
  • A 没有定义

话虽如此,一个Counter适合您的示例作品:

from collections import Counter

time_counter = Counter()

items = [{'Name': 'A', 'Type': 'Run', 'Time': 5},  
          {'Name': 'B', 'Type': 'Walk', 'Time': 15},  
          {'Name': 'C', 'Type': 'Drive', 'Time': 2},
          {'Name': 'D', 'Type': 'Walk', 'Time': 17},  
          {'Name': 'E', 'Type': 'Run', 'Time': 5}]

for item in items:
    time_counter[item['Type']] += item['Time']

print(time_counter)
# Counter({'Walk': 32, 'Run': 10, 'Drive': 2})

要获取元组列表:

[tuple(time_counter.keys()), tuple(time_counter.values())]
# [('Run', 'Drive', 'Walk'), (10, 2, 32)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章