使用Python的enumerate函数时如何引用前一个元素的值?
Got it, let's work through this together. Your core goal makes total sense—you want to count how many times the current price crosses above line_price after being below it. Let's fix the syntax issue and also handle a edge case you might not have noticed yet.
What's Wrong with Your Current Code
First off, [i-1](x) isn't valid Python syntax. To access the previous element in your list, you need to reference the original list directly with mylist[i-1]. Another thing: if you don't skip the first element (i=0), i-1 becomes -1, which in Python grabs the last element of the list—this would mess up your count if the first element is above line_price.
Corrected Code Using Enumerate
mylist = [6000,6000,6000,6200,6200] line_price = 6100 broken_line_count = 0 for i, x in enumerate(mylist): # Skip the first element—there's no prior element to compare if i == 0: continue # Check if current price is above line, and previous was below if x > line_price and mylist[i-1] < line_price: broken_line_count +=1 print(broken_line_count) # Output: 1
A Cleaner Alternative (No Indices Needed)
If you want to avoid dealing with indices entirely, you can pair consecutive elements using zip(). This is often more readable:
mylist = [6000,6000,6000,6200,6200] line_price = 6100 broken_line_count = 0 # Zip creates pairs of (previous_element, current_element) for prev_price, curr_price in zip(mylist, mylist[1:]): if curr_price > line_price and prev_price < line_price: broken_line_count +=1 print(broken_line_count) # Output: 1
How This Works
- In the enumerate approach: we skip the first index because there's nothing to compare it to. For every other element, we check the current value against
line_price, and pull the prior value directly frommylistusingi-1. - In the zip approach:
mylist[1:]creates a copy of the list starting from the second element. Zipping the original list with this sliced version gives us pairs of consecutive elements, so we can just compare each pair directly.
Both methods will correctly count the single cross in your example (when moving from 6000 to 6200).
内容的提问来源于stack exchange,提问作者Blake

