【发布时间】:2015-08-02 15:02:20
【问题描述】:
计算给定窗口 w1 的滚动平均值和滚动最大值。 但使用的是: 您应该编写一个接受迭代器并充当生成元组的生成器的类,如上所示。
例如,给定一个包含以下值的流。 W = 3。
[1, 2, 3, 4, 5, 6]
需要以下元组,其中“None”表示值不可用,在某些语言中为“NaN”:
(None, None) -- When we have input 1 --- As we dont have w num, ignore - None
(None, None) -- Now we have input 1,2
(2, 3) -- Now we have input 1,2,3
(3, 4) -- Discard 1. Window [2,3,4]
(4, 5) -- Discard 3. Window [3,4,5]
(5, 6) -- Discard 4. Window [4,5,6]
在这个元组中,第一个 num 是 w (=3) 个数字的平均值。第二个 num 是 w(=3) 个数字中的最大值。
我还在学习 Python 中的迭代器和生成器/yield。
Que:所以生成器接受整个序列(或迭代器/列表)?如果什么 seq 很大吗?
我写了简单的解决方案,它可能不是有效的算法,但无论如何 我想先知道这对生成器是否正确:
7 from collections import deque
8 class Solution:
9 def sliding_window_avg_max(self, nums, w=3):
10 d = deque(maxlen = w)
11 total = 0
12 for n in nums:
13 if len(d) >= w:
14 total = total - d.pop() + n
15 else:
16 total = total + n
17 d.append(n)
18 if len(d) >= w:
19 yield (total/float(w), max(d))
20 else:
21 yield(None, None)
22
23 s = Solution()
24 a = [1, 2, 3, 4, 5, 6]
25 for t in s.sliding_window_avg_max(a):
26 print t
编辑: 这不是作业问题。这是我想要的面试问题 也知道别人的想法。我真的很想知道生成器如何在这里提供帮助-它不需要列表(nums)在内存中吗? 如果应该,我们将如何使用迭代器?
【问题讨论】:
-
为什么
(1, 2)不存在? -
‘None’ 表示值不可用。流数据问题。当我们有 w = 3 个值时,我们只计算 max/avg。让我编辑它
-
tup = ((l[i], l[i+1]) for i in range(1,len(l)-1))是一个生成器 expr,它为您提供元组序列(2,3) ... (5,6)(只是一个示例,我相信它可以做得更好)。你什么时候需要(无,无)?目前还不清楚。另外:W 是列表的长度吗? -
刚刚编辑了我的问题。第一个 # 是 w 的平均值。其次是最大。当我们没有所有 w=3 数字时,我们不计算任何东西,而是返回 None。
-
None的情况我还是很不清楚。阿尔多,你能回答第一条评论吗?