【发布时间】:2017-09-08 16:37:28
【问题描述】:
我有一个具有属性 "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 的东西有效地完成,但我无法弄清楚。我认为最好的方法是对每个“类型”使用单独的列表理解,但这需要反复遍历列表。我将不胜感激有关如何加快速度的任何想法。
谢谢
【问题讨论】:
-
@roganjosh。实际代码计算并汇总了大约 1.1 个不同路径的 Items 列表,每个路径中有 1 到 250 个 Items。我最初的解决方案在 2860 秒内运行。 Roganjosh 的解决方案(使用字典)运行时间为 1285 秒(快 2.2 倍),而 Eric Dumhill 的解决方案(使用 Counter)运行时间为 899 秒(比我的代码快 3.2 倍)。
-
我还用只有 3000 条路径的较小子集对其进行了测试,并获得了几乎相同的 % 速度提升。
标签: python python-3.x iteration list-comprehension