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中完成一样.
有没有一种有效的方法来做到这一点?
像选项一样,您可以执行以下操作:
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