2. Which of the following Python code snippets correctly computes a simple moving average with window size 3 for a list data?
easy
A. [data[i] / 3 for i in range(len(data))]
B. [sum(data[i:i+3]) for i in range(len(data)-3)]
C. [sum(data[i:i+3]) / 3 for i in range(len(data)-3)]
D. [(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)]
Solution
Step 1: Understand moving average calculation
A simple moving average with window 3 averages each group of 3 consecutive elements.
Step 2: Check each option's correctness
[(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] correctly sums three consecutive elements and divides by 3, iterating till len(data)-2. [sum(data[i:i+3]) for i in range(len(data)-3)] sums but does not divide by 3. [sum(data[i:i+3]) / 3 for i in range(len(data)-3)] divides but uses range(len(data)-3), which is too short. [data[i] / 3 for i in range(len(data))] divides single elements by 3, not averaging groups.
Final Answer:
[(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] -> Option D
Quick Check:
Sum 3 elements / 3, range correct = [(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] [OK]
Hint: Sum 3 elements and divide by 3, loop till len-2 [OK]
Common Mistakes:
Forgetting to divide by window size
Using wrong range length causing index errors
Averaging single elements instead of groups
3. Given the code below, what is the output?
data = [2, 4, 6, 8, 10]
window = 2
moving_avg = [sum(data[i:i+window]) / window for i in range(len(data) - window + 1)]
print(moving_avg)
medium
A. [2.0, 4.0, 6.0, 8.0, 10.0]
B. [3.0, 5.0, 7.0]
C. [3.0, 5.0, 7.0, 9.0]
D. [6.0, 8.0, 10.0]
Solution
Step 1: Calculate moving averages manually
Window size is 2, so average pairs: (2+4)/2=3.0 (4+6)/2=5.0 (6+8)/2=7.0 (8+10)/2=9.0
Step 2: Confirm output list length and values
Length is len(data)-window+1 = 5-2+1=4, matching 4 values above.
Final Answer:
[3.0, 5.0, 7.0, 9.0] -> Option C
Quick Check:
Pairs averaged = [3.0, 5.0, 7.0, 9.0] [OK]
Hint: Average pairs sliding by one, length = len - window + 1 [OK]
Common Mistakes:
Confusing window size with output length
Calculating sums but forgetting to divide
Off-by-one errors in range length
4. The following code is intended to compute a moving average with window size 3, but it misses the last window. What is the problem?
data = [1, 2, 3, 4, 5]
window = 3
moving_avg = [sum(data[i:i+window]) / window for i in range(len(data)-window)]
print(moving_avg)
medium
A. The range should be len(data) - window + 1 to include the last window
B. The window size is too large for the data list
C. sum() cannot be used on list slices
D. Division by window size should be outside the list comprehension
Solution
Step 1: Analyze the range length
Range is len(data)-window = 5-3=2, but to cover all windows it should be len(data)-window+1 = 3.
Step 2: Understand impact of incorrect range
Using len(data)-window misses the last valid window slice, causing incomplete results.
Final Answer:
The range should be len(data) - window + 1 to include the last window -> Option A
Quick Check:
Range length = len - window + 1 [OK]
Hint: Use range(len(data) - window + 1) for full coverage [OK]
Common Mistakes:
Using len(data) - window instead of +1
Thinking sum() can't handle slices
Misplacing division outside comprehension
5. You have daily sales data for 10 days: [10, 12, 11, 14, 13, 15, 16, 14, 13, 12]. You want to smooth this data using a moving average with window size 4 but only want to keep averages where the window's average is greater than 13. Which Python code correctly computes this filtered moving average?
hard
A. [sum(data[i:i+4])/4 for i in range(len(data)-4) if sum(data[i:i+4])/4 > 13]
B. [avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13]
C. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4]) > 13]
D. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4])/4 < 13]
Solution
Step 1: Understand window size and range
Window size 4 means averaging groups of 4 elements, so range is len(data)-3 = 10-3=7.
Step 2: Filter averages greater than 13
[avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13] uses assignment expression to compute average once and filter if > 13. [sum(data[i:i+4])/4 for i in range(len(data)-4) if sum(data[i:i+4])/4 > 13] uses wrong range (len(data)-4=6), missing last window. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4]) > 13] filters sum > 13, not average > 13. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4])/4 < 13] filters averages less than 13, opposite condition.
Final Answer:
[avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13] -> Option B
Quick Check:
Use assignment expression to filter averages > 13 [OK]
Hint: Use assignment expression (walrus) to filter averages [OK]
Common Mistakes:
Using wrong range length missing last windows
Filtering sum instead of average
Using wrong comparison operator
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.