Создать случайное число, избегая дубликатов из данного списка - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над проектом, и мне нужно написать функцию для генерации идентификаторов для каждого клиента в нашей компании. Уже существует список клиентов, и некоторые из них имеют числовой идентификатор от 5 до 6 цифр в диапазоне от 40 000 до 200 000. Существуют другие существующие клиенты, у которых нет идентификатора, и я хотел бы сохранить соответствие с уже существующими номерами идентификаторов (например, 43606 или 125490).

Таким образом, чтобы сохранить аналогичный формат, я создал Exclusion_List, который содержит все существующие идентификационные номера. Затем я собирался написать функцию, используя np.random.uniform(low=40000, high=200000), чтобы генерировать число в этом диапазоне, которое было бы похоже на другие идентификационные номера.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как установить al oop, чтобы проверить, есть ли случайно сгенерированный идентификатор в списке исключений, и если да, то; чтобы создать новый тогда.

Это то, что у меня пока есть:

exclusions = [43606,125490,...]

def ID_Generator(new_clients): # This is a list of new client

  new_client_IDs = []

  for client in new_clients:

    ID = int(np.random.uniform(low=40000, high=200000))

    while ID not in exclusions:

      new_client_IDs.append(ID)

Я не уверен, как обращаться со сценарием, когда случайно сгенерированное число находится в списке исключений. Мне бы хотелось, чтобы эта функция выводила фрейм данных, содержащий имена клиентов в одном столбце и идентификационный номер во втором столбце.

Цените любую помощь в этом!

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Аналогичный ответ Ниранджану, но понимание списка не требуется,

import numpy as np
import pandas as pd

exlcusion_list = [43606,125490]

free_ids = np.arange(40000, 200000)
free_ids = free_ids[~np.isin(free_ids, exlcusion_list)]

def get_ids(client_names):
    new_client_ids = np.random.choice(free_ids, len(client_names), replace=False)

    return pd.DataFrame(data=new_client_ids, index=client_names, columns=["id"])

print(get_ids(["Bob", "Fred", "Max"]))

, что дает

          id
Bob   125205
Fred  185058
Max    86158
0 голосов
/ 07 апреля 2020
exclusions = [43606,125490,...]
def ID_Generator(new_clients): # This is a list of new client

  new_client_IDs = []

  while len(new_client_IDs) < len(new_clients):
    ID = randint(40000, 200000)
    if ID not in exclusions:
      new_client_IDs.append(ID)
    if list(dict.fromkeys(new_client_IDs)):
      new_client_IDs = list(dict.fromkeys(new_client_IDs))
0 голосов
/ 07 апреля 2020

Простой подход, который я могу себе представить:

  1. Создать список из 40000-200000.
  2. Удалить все exclusions из списка выше.
  3. Случайным образом выбрать любой идентификатор из оставшегося списка (В случае важности заказа используйте идентификаторы последовательно).

import random exclusions = [43606,125490] all = range(40000,200000) remaining = [x for x in all if x not in exclusions] random.choice(remaining)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...