Создание случайных списков на основании исходного
Есть, например, следующий список list=['a', 'b', 'c' , 'd', 'e', 'f', 'g', 'h', 'i']
Задача состоит в том, чтобы из него получить 3 новых, в каждом из которых будут содержаться 3 случайно выбранных из list, но в каждом будет иметься уникальный набор букв, что я хочу получить:
list_1 =['a', 'c', 'i']
list_2 =['b','d', 'f']
list_3 = ['e','g', 'h']
Полазив по stackoverflow получился следующий код:
import random
list_1 =random.sample(list,3)
list = [x for x in list if x not in list_1]
list_2 =random.sample([x for x in list if x not in list_1],3)
list = [x for x in list if x not in list_2]
list_3 =random.sample([[x for x in list if x not in list_2],3)
list = [x for x in list if x not in list_3]
Первый список получаем случайным образом, далее удаляем из исходного попавшие в новый список 1. Вновь берем уже почищенный исходный и берем в нем снова 3 случайных.... и т.д.
код рабочий и задача выполняется, однако видно явное повторение кода. Хотелось бы получать новые списки через функцию ( вероятнее всего через цикл).
Просто если дальше исходный список будет состоять, например, из 200 элементов и нужно будет сформировать 40 списков по 5 элементов, так делать уже не получится)
Заранее благодарю!
Ответы (2 шт):
Вот так можно это делать в цикле:
import random
list_ = ['a', 'b', 'c' , 'd', 'e', 'f', 'g', 'h', 'i']
lists = []
NUMBER_OF_LISTS = 3
NUMBER_OF_ELEMENTS_IN_LIST = 3
for i in range(NUMBER_OF_LISTS):
a_list = random.sample(list_, NUMBER_OF_ELEMENTS_IN_LIST)
list_ = [x for x in list_ if x not in a_list]
lists.append(a_list)
А вот вариант с перемешиванием:
random.shuffle(list_)
lists = [
list_[i*NUMBER_OF_ELEMENTS_IN_LIST:(i+1)*NUMBER_OF_ELEMENTS_IN_LIST]
for i in range(NUMBER_OF_LISTS)
]
Не нужно использовать в качесвте имен переменных встроенные назнания функций, классов и т.д. Вот вы используете для хранения списка переменную и назвали ее list. Но уже есть стандартная функция с таким именем. Создав свою переменную вы переопределили это имя и теперь вы не сможете использовать эту стандартную функцию.
Это может привести к ошибкам в будущем, когда вы попытаетесь использовать стандартную функцию, а вместо этого будет использован ваша переменная. Хорошо, если сразу получите ошибку и догадаетесь в чем дело, но иногда это бывает сложно.
Так что лучше не использовать стандартные имена и в этом примере я изменил название переменной с list на list_.
Вот вам еще вариант с numpy. Есть подозрение, что при больших объемах данных он будет эффективнее:
import numpy as np
lst=['a', 'b', 'c' , 'd', 'e', 'f', 'g', 'h', 'i']
res = [list(x) for x in np.split(np.random.permutation(lst),3)]
res:
[['c', 'i', 'a'], ['e', 'f', 'g'], ['b', 'h', 'd']]
Если вас устраивает тип данных ndarray, то код можно еще больше оптимизировать:
import numpy as np
lst=['a', 'b', 'c' , 'd', 'e', 'f', 'g', 'h', 'i']
res = np.split(np.random.permutation(lst),3)
res:
[array(['i', 'g', 'e'], dtype='<U1'),
array(['a', 'h', 'b'], dtype='<U1'),
array(['d', 'f', 'c'], dtype='<U1')]