2017-01-12 2 views
-1

Мне нужна помощь по небольшой логике с использованием python.Как получить 5 различных наборов списка в Python?

У меня есть несколько списков разных размеров. Для каждого списка мне нужно сгенерировать 5 разных наборов (списков), и каждый сформированный набор должен иметь 5 элементов. Каждый элемент набора должен генерироваться случайным образом.

Важно отметить, что множество {a, b, c} равно множеству {b, a, c}.

Example: L1 = {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s} 

Set 1 = {a, c, e, h, i, s} 
Set 2 = {a, b, c, d, e, f} 
Set 3 = {m, n, o, p, q, r} 
Set 4 = {e, n, k, a, i, s} 
Set 5 = {h, ​​p, a, i, g, k} 

Может ли кто-нибудь помочь мне в логике Python? Спасибо!

+0

Что вы пробовали? Любой код, созданный вами? Любое сообщение об ошибке? Ваш вопрос слишком широк. –

+2

Связанный: [Выберите 5 различных элементов из списка] (https://stackoverflow.com/questions/4601346/choose-5-different-elements-from-a-list) – kojiro

+0

конвертировать список для установки, а затем использовать модуль 'random '5 раз, чтобы создать 5 списков с 5 элементами – furas

ответ

1

комбинат random.sample с itertools.combinations:

>>> import itertools 
>>> import random 

>>> [set(i) for i in random.sample(list(itertools.combinations(L1, 5)), 5)] 
[{'c', 'h', 'i', 'l', 'q'}, 
{'a', 'd', 'o', 'p', 'r'}, 
{'b', 'h', 'j', 'k', 'l'}, 
{'b', 'd', 'g', 'n', 's'}, 
{'d', 'f', 'i', 'l', 's'}] 

Или, если combinations слишком медленно, то вы можете взять образцы до тех пор, пока вы не имеете 5 различных них:

res = [] 
while len(res) < 5: 
    samp = set(random.sample(L1, 5)) 
    if samp not in res: 
     res.append(samp) 

res 
[{'a', 'b', 'd', 'g', 'q'}, 
{'e', 'g', 'i', 'j', 'q'}, 
{'h', 'i', 'j', 'k', 'n'}, 
{'b', 'e', 'j', 'n', 's'}, 
{'e', 'f', 'g', 'l', 'r'}] 
0

Вы можете использовать подход с хитом и пропуском, если вы хотите сгенерировать 5 различных наборов:

import random 

L1 = {c for c in 'abcdefghijklmnopqrstuvwxyz'} 
sets = set() 
items = list(L1) 
while len(sets) < 5: 
    s = frozenset(random.sample(items,5)) 
    sets.add(s) 

sets = [set(s) for s in sets] 

for s in sets: print(s) 

Типичный выход:

{'w', 'b', 'p', 'j', 'r'} 
{'b', 'p', 'v', 'l', 'o'} 
{'q', 'c', 'i', 'z', 't'} 
{'j', 'f', 'h', 'l', 'y'} 
{'b', 'h', 'd', 'r', 'c'} 

Для задач данного размера, то это должно быть адекватным. 26 выберите 5 = 65780, поэтому столкновения должны быть редкими. Поскольку L1 приближается к 5, становится труднее получить 5 различных наборов.

+0

вам не нужно 'if s not in sets', потому что' sets' является 'set' и, следовательно, не изменит его размер, если вы добавите идентичный элемент. – MSeifert

+0

@MSeifert Хорошая точка. Исправлена. –

Смежные вопросы