pythonlistrecursionindex-error

Recursion leads to list IndexError


I'm trying to:

1 - Generate a list of numbers (specifically RGB colors);

2 - Get a random number from said list;

3 - Select the numbers of that list that are sufficiently distant from this random number;

4 - Get a new random number from this new list.

Rinse and repeat k - 1 times.

This is a MWE:

import math
import random
import seaborn as sns

num_list = list(sns.color_palette('rainbow', 10))

base_num = random.choice(num_list)


def distant_numbers(base_num, num_list, dist):
    
    selectables = []

    for num in num_list:
        if math.dist(base_num, num) >= dist:
            selectables.append(num)
    
    new_base_num = random.choice(selectables)
    
    return distant_numbers(new_base_num, selectables, dist)

But

for k in range(3):
    print(distant_numbers(base_num, num_list, 0.1))

Gives IndexError: list index out of range.


Solution

  • You should try something like this:

    def distant_numbers(base_num, num_list, dist, k):
        if k == 0 or len(num_list) < 2:
            return base_num
        selectables = []
        for num in num_list:
            if math.dist(base_num, num) >= dist:
                selectables.append(num)
        new_base_num = random.choice(selectables)
        return distant_numbers(new_base_num, selectables, dist, k-1)
    
    

    then call function like the following:

    for k in range(3):
        print(distant_numbers(base_num, num_list, 0.1, k))
    

    The problem with your code is that the function "distant_numbers" continues to call itself without any stopping point, causing an infinite loop. This leads to the "selectables" list being empty and an error when trying to pick a random number from it. To fix this, you can add an exit point to the function where it returns "new_base_num" if the "selectables" list is less than 2 in length. Additionally, you can also limit the number of times the function calls itself by including a parameter to keep track of the recursion count.