Идиома Случайного Среза Python

есть ли питонический способ срезать тип последовательности так, чтобы возвращаемый срез был случайный длина и случайном порядке? Например, что-то вроде:

>>> l=["a","b","c","d","e"]
>>> rs=l[*:*]
>>> rs
['e','c']

3 ответов


Как насчет...

random.sample(l, random.randint(1, len(l)))

можно найти быструю ссылку на документы для случайного модуля здесь.


нет идиомы, о которой я знаю, но random.sample делает то, что вам нужно.

>>> from random import sample, randint
>>> 
>>> def random_sample(seq):
...     return sample(seq, randint(0, len(seq)))
... 
>>> a = range(0,10)
>>> random_sample(a)
[]
>>> random_sample(a)
[4, 3, 9, 6, 7, 1, 0]
>>> random_sample(a)
[2, 8, 0, 4, 3, 6, 9, 1, 5, 7]

есть тонкое различие, которое не касается ни вашего вопроса, ни других ответов, поэтому я чувствую, что должен указать на это. Это иллюстрируется приведенным ниже примером.

>>> 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).