繁体   English   中英

使用元组python列表

[英]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)]}

请注意,由于未指定变量time1value1等,因此我都使用了整数,尽管时间变量的字符串值和值变量的整数值也是有效的。

假设列表已经按时间排序 ,并且您始终希望比较连续的值(而不是比较之间的时间差的值),则可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM