есть замечательный модуль
https://docs.python.org/3.5/library/itertools.html
в котором есть функции работы с комбинаторикой:
product('ABCD', repeat=2)
permutations('ABCD', 2)
combinations('ABCD', 2)
combinations_with_replacement('ABCD', 2)
ну и соответственно варианты с получением случайного объекта:
random_product
random_permutation
random_combination
random_combination_with_replacement
посмотрите почитайте, это позволит сразу сделать выборку неповторяющихся элементов.
Именно для избегания сложных if, а в них как понимаю вы проверяете что ингредиенты уникальны, можно воспользоваться set
if len(NABOR) != len(set(NABOR))
либо вот таким решением
stackoverflow.com/a/5281641 - на больших объектах будет гораздо производительнее.
вот эти проверки
if CARD == SLOGNOST[0]:
elif CARD == SLOGNOST[1]:
...
тоже плохой код, у вас фактически одна и таже логика просто меняется количество элементов зелья, вынесите в конфиг, что такой-то сложности соответствует такоей-то количество элементов, и исходя из этого числа создавайте списки с нужным количеством ингридиентовв и тд и тп
str(random.choice(SLOGNOST))
так random.choice и так вернёт строку, зачем ещё вызывать преобразование в строку? (и так несколько раз)