【问题标题】:How to create a new dictionary using aggregate values from another dictionary如何使用来自另一个字典的聚合值创建一个新字典
【发布时间】:2021-10-19 14:35:42
【问题描述】:

我有一本字典,以一天中的时间为键,以股票价格为值。一天中的每一分钟都有一把钥匙:

original_dict = {'09:30': '2170.8601', '09:31': '2180.21', '09:32': '2181.76'... '16:15': '2179.98'}

我正在尝试创建一个新字典,它将时间作为键和值作为一个列表,使用滚动 10 分钟的增量包含开盘价、最高价、最低价和收盘价(原始字典中的值):

new_dict = {'09:40': [open, high, low, close], '09:41': [open, high, low, close]...}

new_dict 从 9:40 开始,因为要计算第一个键/列表需要 10 分钟)

例如,new_dict 中 9:40 键的值列表应使用 original_dict 中 9:30-9:39 的值计算。开盘价、最高价、最低价和收盘价分别是来自original_dict9:309:30-9:39 的最大值、9:30-9:39 的最小值和9:39 值。 9:41 键将具有使用来自original_dict9:31-9:40 值计算的开盘、高点、低点、收盘值等等。

我不确定如何轻松地执行 for 语句,例如,使用 original_dict,因为它不是一个列表。我应该从original_dict 创建一个中间键列表并使用它来迭代时间吗?

创建new_dict 的最佳方式是什么?

谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    这需要相当多的编码,所以我将写出可以帮助您完成工作的步骤。

    1. 将字符串键 ('09:30') 转换为数字('09:30' 为 9*60 + 30 = 2130 小时)。
    2. 从字典中最早的一分钟到最后一分钟进行迭代,并将与每一分钟关联的值存储在一个列表中。您现在应该有一个按时间顺序排序的值列表。
    3. 维护一个滑动窗口最大队列和滑动窗口最小队列,在您的情况下窗口大小为 10。
    4. 然后在每一步,从滑动窗口最大队列中获取“高价”,同样获取“低价”。对于“起始价格”,您只需回顾我们之前形成的排序值列表中的 10 个索引。对于“最终价格”,我们只关注一个指数。

    应该就是这样。也许这里棘手的部分是实现滑动窗口最大值/最小值,您可以采用一个函数的following implementation,该函数接受一个数字列表,并返回我们中每个大小为 k 的连续窗口的最大值的另一个列表列表。在 O(N) 时间内运行,其中 N 是列表的大小。

    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        deque = collections.deque()
        res = []
        for i, num in enumerate(nums):
            while(deque and nums[deque[-1]] < num):
                deque.pop()
            if(deque and i - deque[0] >= k):
                deque.popleft()
            deque.append(i)
            res.append(nums[deque[0]])
        return res[k-1:]
    

    您同样会获得 Sliding Window Minimum,并且您应该有足够的希望让它工作。

    【讨论】:

    • 哇,感谢@Ayush 的反馈,我会试一试的!
    猜你喜欢
    • 2022-10-05
    • 2021-07-07
    • 1970-01-01
    • 2022-07-23
    • 2016-10-05
    • 2014-06-17
    • 2021-03-09
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多