 # Need help with this challenge

I can’t figure out how to make this code dynamic?
I am supposed to find the nearest value to a giving number in a giving set.

Find the nearest value to the given one.

You are given a list of values as set form and a value for which you need to find the nearest one.

For example, we have the following set of numbers: 4, 7, 10, 11, 12, 17, and we need to find the nearest value to the number 9. If we sort this set in the ascending order, then to the left of number 9 will be number 7 and to the right - will be number 10. But 10 is closer than 7, which means that the correct answer is 10.

A few clarifications:

• If 2 numbers are at the same distance, you need to choose the smallest one;
• The set of numbers is always non-empty, i.e. the size is >=1;
• The given value can be in this set, which means that it’s the answer;
• The set can contain both positive and negative numbers, but they are always integers;
• The set isn’t sorted and consists of unique numbers.

Input: Two arguments. A list of values in the set form. The sought value is an int.

Output: Int.

``````def nearest_value(values, one):
for i in values:
if one in values:
return one
elif (one - 1 in values) and (one + 1 in values):
return one - 1
else:
if one + 1 in values:
return one + 1

print(nearest_value({4, 7, 10, 11, 12, 17}, 9))  # == 10
print(nearest_value({4, 7, 10, 11, 12, 17}, 8))  # == 7
print(nearest_value({4, 8, 10, 11, 12, 17}, 9))  # == 8
print(nearest_value({4, 9, 10, 11, 12, 17}, 9))  # == 9
print(nearest_value({4, 7, 10, 11, 12, 17}, 0))  # == 4
print(nearest_value({4, 7, 10, 11, 12, 17}, 100))  # == 17
print(nearest_value({5, 10, 8, 12, 89, 100}, 7))  # == 8
print(nearest_value({-1, 2, 3}, 0))  # == -1
``````

Hello @kasem007

You seem to be on the right track, but it appears you run in to the problem that your code doesn’t know what to do if the answer is farther away than 1.

Try doing something like this.

If your number is in the list that is the correct answer
If it is not in the list subtract a `value` from it and see if that is in the list.
If that is not in the list add that `value` to it and see if it is in the list.
Finally if that is still not there, increase the `value` and repeat the procedure until you find the number.

Another way to do it could include `abs()`

1 Like

You’d measure the difference of each value to `one`
you would not test specific differences, you wouldn’t test for 0 difference or 1 or any other

overall the task is: minimum of values by difference to `one`

it’s the same thing as the built-in `min` function, which can indeed be used here

1 Like

How can I find the nearest Value without using a lambda function?
I found the answer using lambda function but I don’t really understand what is happening.

``````def nearest_value(values, one):
if one in values:
return one
else:
return min(values, key=lambda x: abs(x - one))

print(nearest_value({4, 7, 10, 11, 12, 17}, 9))  # == 10
print(nearest_value({4, 7, 10, 11, 12, 17}, 8))  # == 7
print(nearest_value({4, 8, 10, 11, 12, 17}, 9))  # == 8
print(nearest_value({4, 9, 10, 11, 12, 17}, 9))  # == 9
print(nearest_value({4, 7, 10, 11, 12, 17}, 0))  # == 4
print(nearest_value({4, 7, 10, 11, 12, 17}, 100))  # == 17
print(nearest_value({5, 10, 8, 12, 89, 100}, 7))  # == 8
print(nearest_value({-1, 2, 3}, 0))  # == -1
``````

keep in mind:

# Input: Two arguments. A list of values in the set form. The sought value is an int.

You’re still testing for a difference of zero, that’s not a special case.

lambda just creates a function, it’s not special, you know how to create functions, so create a function.

You can also implement min yourself. The point isn’t so much that the function already exists as it is that min is the algorithm that you’d use.

This code work with most cases except 2 of them it gives me “None” can you help me fix it?

``````def nearest_value(values, one):
x = 1
if one in values:
return one
else:
for i in values:
if (one - x) in values:
return one - x
elif one + x in values:
return one + x

print(nearest_value({4, 7, 10, 11, 12, 17}, 9))  # == 10
print(nearest_value({4, 7, 10, 11, 12, 17}, 8))  # == 7
print(nearest_value({4, 8, 10, 11, 12, 17}, 9))  # == 8
print(nearest_value({4, 9, 10, 11, 12, 17}, 9))  # == 9
print(nearest_value({4, 7, 10, 11, 12, 17}, 0))  # == 4
print(nearest_value({4, 7, 10, 11, 12, 17}, 100))  # == 17
print(nearest_value({5, 10, 8, 12, 89, 100}, 7))  # == 8
print(nearest_value({-1, 2, 3}, 0))  # == -1
``````

You could add a statement after the `for` loop that adds one to `x`.
Then then nest the `for` loop in a `while` loop that will continue until the `for` loop returns something.

1 Like

you still have a whole special case dedicated to a difference of 0 even though that isn’t special

you’re not supposed to guess what the difference will be. you’re supposed to compare the differences that already exist

``````def nearest_value(values, one):
closest = None
closest_dist = None
for v in values:
dist = abs(v - one)
if closest_dist is None or dist < closest_dist:
closest = v
closest_dist = dist
elif dist == closest_dist:
closest = min(v, closest)
return closest
``````
1 Like