如何修改Python代码获取列表中小于指定值且最接近的整数
Hey there! The issue with your current code is that it's considering all elements in the list when looking for the closest value—including those larger than your target real_price. Since 101 is only 1 away from 100, it gets picked even though it's bigger than what you want.
Here are two straightforward fixes to get the result you're after:
1. Filter first, then find the closest
The most intuitive approach is to narrow down your list to only elements that are less than real_price, then find the closest value among those candidates. This ensures you never pick a number that's too big.
def price(my_list, real_price): # Keep only numbers smaller than the target price valid_candidates = [x for x in my_list if x < real_price] # Handle edge case where no valid numbers exist (adjust as needed) if not valid_candidates: return None # Or raise an error, return 0, etc. # Find the closest number in the filtered list closest_number = min(valid_candidates, key=lambda x: abs(x - real_price)) return closest_number my_list = [101, 90, 70] real_price = 100 closest_number = price(my_list, real_price) print(closest_number) # Output: 90
2. Adjust the key function to prioritize smaller values
If you prefer a more concise solution without filtering, you can tweak the key used in min() to penalize numbers that are larger than real_price. We'll use a tuple as the key:
- The first element is a boolean (
Trueif the number is >= target,Falseotherwise) — sinceFalseis treated as 0 andTrueas 1, all smaller numbers will come first in the sorting. - The second element is the absolute difference, so we still pick the closest among the valid candidates.
def price(my_list, real_price): closest_number = min( my_list, key=lambda x: (x >= real_price, abs(x - real_price)) ) return closest_number my_list = [101, 90, 70] real_price = 100 closest_number = price(my_list, real_price) print(closest_number) # Output: 90
Just note that if all elements in the list are larger than real_price, the second method will return the smallest of those (since it's the "least bad" option). If you want to handle that case explicitly (like returning None), the first method is easier to adjust.
内容的提问来源于stack exchange,提问作者Dharamveer Grewal

