[英]Working with lists of tuples python
我正在使用字典,其中每个键都包含一个元组列表。 看起来像这样:
dict1 = {'key1': [(time1, value1), (time2, value2), (time3, value3)],
'key2': [(time4, value4), (time5, value5), (time6, value6)],
'key3': [(time7, value7), (time8, value8), (time9, value9)], ...}
对于每个键,希望做的是找到“ valueX”从“ timeX”到“ timeY”的最大下降。
元组是命令,因此
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)保存与“值”的最大下降相对应的时间。
我希望你能在这里帮助我。 非常感谢。
对于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
等,因此我都使用了整数,尽管时间变量的字符串值和值变量的整数值也是有效的。
假设列表已经按时间排序 ,并且您始终希望比较连续的值(而不是比较之间的时间差的值),则可以使用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])))
另外,请注意,如果您正在寻找最大的跌幅 ,则必须找到value1 - value2
的最大值,而不是value2 - value1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.