【问题标题】:Working with lists of tuples python使用元组列表 python
【发布时间】:2018-03-02 23:20:53
【问题描述】:

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

dict1 = {'key1': [(time1, value1), (time2, value2), (time3, value3)],
         'key2': [(time4, value4), (time5, value5), (time6, value6)],
         'key3': [(time7, value7), (time8, value8), (time9, value9)], ...}

希望对每个键做的是找到从 'timeX' 到 'timeY' 的 'valueX' 的最大下降。

元组是顺序,所以

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) 保存与“值”最大下降相对应的时间。

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

【问题讨论】:

    标签: python list loops dictionary tuples


    【解决方案1】:

    对于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 等,因此我对两者都使用了整数,尽管时间变量的字符串值和值变量的整数值也是有效的。

    【讨论】:

    • 在上面,哪里说我们希望为dict1运行这段代码?
    • @C.Refsgaard 如果您想使用名称不是dict1 的不同字典,那么函数将是最佳选择。请查看我最近的编辑。
    • 这给出了无效的语法,并且变量b 也没有定义。可能是复制粘贴错误?另外,为什么要累积两次?这是否适用于具有三个以上值的列表?
    • @tobias_k 抱歉出现错误。我的文本编辑器中有正确的版本。为了使代码成为一行,我不得不累积两次。对于超过三个值的列表的输入,此代码将不起作用,因为 OP 仅指定了两个变量,timevalue。但是,如果 OP 可以更新他的帖子并提及他想要的输出,则可以修改此代码以考虑长度大于 2 的元组列表。
    • 我说的不是超过两个值的元组,而是超过三个元组的列表。这样做只是检查(以一种非常复杂的方式)第一个和第二个值之间的差异是否大于第二个和第三个值的差异。
    【解决方案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 的最大值。

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多