我正在处理一个字典,其中每个键都包含一个元组列表。它看起来像这样:
dict1 = {'key1': [(time1, value1), (time2, value2), (time3, value3)],
'key2': [(time4, value4), (time5, value5), (time6, value6)],
'key3': [(time7, value7), (time8, value8), (time9, value9)], ...}
每个密钥的目标是找到价值最大的X'从' timeX'到了' timeY'。
元组是orderes所以
time1 < time2 < time3
(通常)
value1 > value2 > value3
所有键都适用。
所以看第一把钥匙,我想做的是计算
value2 - value1 and value3 - value2
并节省发生最大跌幅的时间。我们来说
value2 - value1 > value3 - value2
然后我希望保存time1和time2,因为在这两个时间值之间发生了最大的下降。
我正在考虑使用如下的for循环:
for key in dict1:
for i in dict1[key]:
但我无法弄清楚如何
1)遍历这些值,计算当前值和过去值之间的差值,保存并将其与已观察到的最大跌幅进行比较
2)保存与“&#39;值”中最大下降相对应的时间。
我希望你能在这里帮助我。非常感谢。
答案 0 :(得分:2)
对于Python3,可以使用itertools.accumulate
:
from itertools import accumulate
import operator
def get_times(d):
final_data = {a:[(b[0][0], b[1][0]) if list(accumulate([i[-1] for i in b], func = operator.sub))[0] > list(accumulate([i[-1] for i in b], func = operator.sub))[1] else (b[1][0], b[2][0])] for a, b in d.items()}
return final_data
dict1 = {'key1': [(1, 3), (23, 12), (3, 5)],
'key2': [(4, 41), (5, 54), (4, 6)],
'key3': [(7, 17), (8, 18), (9, 19)]}
print(get_times(dict1))
输出:
{'key2': [(4, 5)], 'key3': [(7, 8)], 'key1': [(1, 23)]}
请注意,由于未指定变量time1
,value1
等,因此我使用了两者的整数,尽管时间变量的字符串值和值变量的整数值也是有效的。
答案 1 :(得分:2)
假设列表是already sorted by time,并且您总是想要比较连续值(而不是,例如,两者之间具有相同时间差的值),您可以使用zip(lst, lst[1:])
配方进行迭代列表中的连续对,并使用max
和自定义key
函数来查找具有最大差异的对。
def biggest_drop(timeseries):
pairs = zip(timeseries, timeseries[1:])
((t1, v1), (t2, v2)) = max(pairs, key=lambda p: p[0][1] - p[1][1])
return (t1, t2)
dict1 = {'key1': [("time1", 23), ("time2", 22), ("time3", 24)],
'key2': [("time4", 12), ("time5", 9), ("time6", 3)],
'key3': [("time7", 43), ("time8", 50), ("time9", 30)]}
print({k: biggest_drop(v) for k, v in dict1.items()})
# {'key3': ('time8', 'time9'), 'key2': ('time5', 'time6'), 'key1': ('time1', 'time2')}
或更短(但不一定更好):
def biggest_drop(timeseries):
return next(zip(*max(zip(timeseries, timeseries[1:]),
key=lambda p: p[0][1] - p[1][1])))
另请注意,如果您要查找最大的 drop ,则必须找到value1 - value2
而不是value2 - value1
的最大值。