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:

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.

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