Я пытаюсь найти разумно эффективный способ получить любое одиночное целое, но не в наборе. Например, если у меня есть numbers={1, 4, 9}
, то действительным результатом будет 3
. Я могу сделать это так:Найти номер не в наборе
n = random.randint(-100, 100)
if n not in numbers:
return n
Но я не хочу быть ограничены в произвольном диапазоне (например, -100 -> 100), так как я понятия не имею, как большой набор будет. Другой вариант - перебрать все целые числа, но это было бы ужасно неэффективно.
Есть ли у кого-нибудь какие-либо предложения относительно лучшего способа сделать это?
Редактировать: Из-за количества вопросов о том, что я пытаюсь сделать, я обновляю этот вопрос, чтобы объяснить некоторые из фона.
То, что я на самом деле пытается достичь, это отображение что-то вроде этого: {a: 1, b: 2, c: 1}
где a
, b
и c
являются экземплярами объектов. Значения в этом уникальном для группы, поэтому я могу сказать, что a
и c
находятся в группе 1, а b
находится в группе 2. Фактическое число не имеет значения, это просто уникальный ключ для группы и не имеет отношения ни к чему вне эта структура. Фактическая структура представляет собой таблицу базы данных с двумя полями, обе из которых индексируются, так что я могу быстро узнать, например, что еще находится в той же группе, что и a
.
Теперь, для чего мне нужен уникальный номер, это когда я хочу добавить группу. Это происходит не очень часто, поэтому это не должно быть невероятно эффективным, но поскольку объем данных может быть довольно большим, мне нужно сохранить количество итераций. Я понимаю, что есть несколько простых способов сделать это с приемлемыми ограничениями, например. используя randint
с большим диапазоном (например, 1e6) или, возможно, даже с использованием функции базы данных. Но так как я думал об этом, стало интересно найти точное решение для заполнения значений без жестко заданных ограничений. Очевидно, что ограничения памяти (например, максимальный размер целого) все еще применяются.
Значит ли это одно целое число должно быть между максимальным и минимальным числом набора? – jamylak
Для эффективности вы можете написать небольшую функцию для вычисления минимального, максимального и подсчета вашего набора. Затем математически определите, есть ли пробелы. Если есть пробел, вы можете проверить каждый номер с мин, если нет пробела, вы можете выбрать max + 1 или min-1. – MattH
@jamylak: Нет, это может быть любое число. Я в основном пытаюсь сгенерировать ключи для использования в словаре. – aquavitae