Есть тонкое различие, к которому не обращаются ни ваш вопрос, ни другие ответы, поэтому я чувствую, что должен это указать. Это показано на примере ниже.
>>> random.sample(range(10), 5)
[9, 2, 3, 6, 4]
>>> random.sample(range(10)[:5], 5)
[1, 2, 3, 4, 0]
Как видно из выходных данных, первая версия не «разрезает» список, а только пробует его, поэтому возвращаемые значения могут быть откуда угодно в списке. Если вам буквально нужен «фрагмент» списка, то есть если вы хотите ограничить пространство выборки перед выборкой, то следующее не делает то, что вы хотите:
random.sample(l, random.randint(1, len(l)))
Вместо этого вам придется сделать что-то вроде этого:
sample_len = random.randint(1, len(l))
random.sample(l[:sample_len], sample_len)
Но я думаю, что лучший способ сделать это был бы так:
shuffled = l[:random.randint(1, len(l))]
random.shuffle(shuffled)
К сожалению, мне не известна версия shuffle
с возвратом копии (т. Е. shuffled
сродни sorted
).