Python随机切片成语

| 有没有一种pythonic方法可以对序列类型进行切片,以使返回的切片具有随机长度和随机顺序?例如,类似:
>>> l=[\"a\",\"b\",\"c\",\"d\",\"e\"]
>>> rs=l[*:*]
>>> rs
[\'e\',\'c\']
    
已邀请:
        怎么样...
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)
不幸的是,我没有意识到ѭ8的副本返回版本(即类似于ѭ10的
shuffled
)。     

要回复问题请先登录注册