使用元组python列表

时间:2017-09-21 14:34:46

标签: python list loops dictionary tuples

我正在处理一个字典,其中每个键都包含一个元组列表。它看起来像这样:

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;值”中最大下降相对应的时间。

我希望你能在这里帮助我。非常感谢。

2 个答案:

答案 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)]}

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

答案 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的最大值。