Создание случайного списка выборки из генеральной совокупности, не имеющей общих элементов с другим списком - PullRequest
0 голосов
/ 08 мая 2020

I wi sh для выборки элементов из списка таким образом, чтобы ни один из элементов не содержался в другом списке указанных элементов. Я буду sh продолжать генерировать новые образцы, пока не будет сгенерирован тот, который не пересекается. Этот код ниже - это то, о чем я подумал, но он не работает, когда есть пересекающийся исходный образец, он переходит в бесконечное l oop, и печать показывает, что все сгенерированные образцы одинаковы.

import random 
unique_entities=['100','1001','10001','100001','11111']
pde_fin= ['2151', '2146', '2153', '2135', '2158', '2160', '2137', '2169', '2147', '2015', '2022', '2173', '2028', '2014', '2018', '2009', '1140', '1085', '1136', '1132', '1007', '1080', '1078', '1131', '1106', '1164', '1092', '1108', '1118', '1045', '1051', '1006','1001']
random_entities=random.sample(unique_entities,3) #choses 5 unique entities 
while(not(set(random_entities).isdisjoint(pde_fin))):
       random_entites=random.sample(unique_entities,5)
       print(random_entities,"random_entites")

print(unique_entities)

Не могли бы вы помочь мне понять, что происходит не так?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Есть две проблемы со строкой random_entites=random.sample(unique_entities,5):

  • Во-первых, это опечатка, вы написали random_entites вместо random_entities.
  • Во-вторых, вы берете выборку из 5 элементов из unique_entities, которая содержит всего 5 элементов. Поэтому образец всегда содержит элемент '1001', единственный элемент, который также присутствует в pde_fin.

Вот рабочая версия программы, которая включает некоторые другие настройки:

import random

unique_entities = ['100', '1001', '10001', '100001', '11111']
pde_fin = ['2151', '2146', '2153', '2135', '2158', '2160', '2137', '2169', '2147', '2015', '2022', '2173', '2028',
           '2014', '2018', '2009', '1140', '1085', '1136', '1132', '1007', '1080', '1078', '1131', '1106', '1164',
           '1092', '1108', '1118', '1045', '1051', '1006', '1001']

sample_size = 3

random_entities = set(random.sample(unique_entities, sample_size))
print(f"{random_entities=}")
while not random_entities.isdisjoint(pde_fin):
    random_entities = set(random.sample(unique_entities, sample_size))
    print(f"{random_entities=}")

print(f"Result: {random_entities}")
0 голосов
/ 08 мая 2020

Вы можете отфильтровать unique_entities перед выполнением выборки. Математически фильтрация до и после одинакова с точки зрения случайности.

unique_entities=['100','1001','10001','100001','11111']
pde_fin= ['2151', '2146', '2153', '2135', '2158', '2160', '2137', '2169', '2147', '2015', '2022', '2173', '2028', '2014', '2018', '2009', '1140', '1085', '1136', '1132', '1007', '1080', '1078', '1131', '1106', '1164', '1092', '1108', '1118', '1045', '1051', '1006','1001']
unique_entities_unique = [i for i in unique_entities if not i in pde_fin]
random_entities=random.sample(unique_entities_unique,3)
print(random_entities,"random_entites")
...