python lambda,numpy帮助找到时间的总和

use*_*431 2 python lambda numpy

我有以下清单,

Events = [0, 0, 0, 1, 1, 0]
Details = ['Start', 'End', 'Start', 'Start', 'End', 'End]
Time = [0, 1, 4, 5, 10, 16]
Run Code Online (Sandbox Code Playgroud)

我需要按以下方式对单个事件进行分组:

Event 0:
Sum of Start Times = 0+4 = 4
Sum of End Times = 1+16 = 17
Total time spend by event 0 = 17-4 = 13

Event 1:
Sum of start times = 5
Sum of end times = 10
Total time spend by event 1 = 10-5=5
Run Code Online (Sandbox Code Playgroud)

我想要一些速记版本来做这件事.当存在大量事件和大量时序时,定义for-if循环类型的语法就像在Java中完成一样.

有没有一种有效的方法来做到这一点?

Art*_*nka 5

像选项一样,您可以执行以下操作:

result = {}
for e, d, t in zip(Events, Details, Time):
    result.setdefault(e, {})
    result[e].setdefault(d, 0)
    result[e][d] += t

print result
>>> {0: {'Start': 4, 'End': 17}, 1: {'Start': 5, 'End': 10}}
Run Code Online (Sandbox Code Playgroud)

之后,很容易产生您期望的输出.

更新:

感谢@abarnert:来自集合导入计数器

result = {}
for e, d, t in zip(Events, Details, Time):
    result.setdefault(e, collections.Counter())[d] += t
print result
>>> {0: Counter({'End': 17, 'Start': 4}), 1: Counter({'End': 10, 'Start': 5})}
Run Code Online (Sandbox Code Playgroud)

感谢@AMacK:

result = {}
for e, d, t in zip(Events, Details, Time):
    result.setdefault(e, {}).setdefault(d, []).append(t)

print result
>>> {0: {'Start': [0, 4], 'End': [1, 16]}, 1: {'Start': [5], 'End': [10]}}
Run Code Online (Sandbox Code Playgroud)

最诚挚的问候,Artem

  • Ack,你打败了我!您还可以将结果[e] .setdefault(d,0)更改为结果[e] .setdefault(d,[]).append(t)并删除以下行以保留组件值. (2认同)
  • 如果你要使用`setdefault`,你可以直接使用返回的值.例如,用一行替换所有三行,`result.setdefault(e,collections.Counter())[d] + = t`或(对于@ AMacK的版本,`result.setdefault(e,{}). setdefault(d,[]).append(t)`). (2认同)