我有一个 python dictionary
,其中包含 3 个 lists
,键分别为“time”、“power”和“usage”。
所有列表都具有相同数量的元素,并且所有列表都已排序。什么
我想做的是总结列表“功能”和“使用”的所有元素,它们的索引
对应列表'time'中的相同值,以便每个时间单位只有一个功率和使用样本。
例如转换这个字典:
{'time': [1, 2, 2, 3, 4, 4, 5],
'power': [2, 2, 3, 6, 3, 3, 2],
'usage': [0, 1, 1, 2, 1, 4, 7]}
这个:
{'time': [1, 2, 3, 4, 5],
'power': [2, 5, 6, 6, 2],
'usage': [0, 2, 2, 5, 7]}
我已经编写了这段有效的代码,但我不喜欢 这么多:
d = {'time':[1,2,2,3,4,4,5], 'power':[0,1,1,2,1,4,7], 'usage':[2,2,3,6,3,3,2]}
prev = -1
new_d = {'time':[], 'power': [], 'usage':[]}
indexes = range( len(d['time']) )
for i in indexes:
if d['time'][i]!=prev:
new_d['time'].append(d['time'][i])
new_d['power'].append(d['power'][i])
new_d['usage'].append(d['usage'][i])
else:
last_power = len( new_d['power'] ) - 1
last_usage = len( new_d['usage'] ) - 1
new_d['power'][last_power]+=d['power'][i]
new_d['usage'][last_usage]+=d['usage'][i]
prev=d['time'][i]
print d
print new_d
有没有更简单、更全面的pythonian方法?
最佳答案
一个强大的解决方案,可以处理任意数量的额外字段 - 按“时间”字段排序(作为一种方法):
def aggregate(old_d, sort_key='time'):
new_d = dict((k, []) for k in old_d)
prev = None
curr = None
for i in range(len(old_d[sort_key])):
curr = old_d[sort_key][i]
for key, lst in new_d.iteritems(): # .items() in Python 3+
if prev == curr:
if key != sort_key:
lst[-1] += old_d[key][i]
else:
lst.append(old_d[key][i])
prev = curr
return new_d
使用你的字典:
d = {'time': [1, 2, 2, 3, 4, 4, 5],
'power': [2, 2, 3, 6, 3, 3, 2],
'usage': [0, 1, 1, 2, 1, 4, 7]}
print aggregate(d)
>>>
{'usage': [0, 2, 2, 5, 7], 'power': [2, 5, 6, 6, 2], 'time': [1, 2, 3, 4, 5]}
关于python - 如何根据 Python 中第一个列表的相同元素对 3 个相同大小的排序列表求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15926358/