2011-05-29 17 views
6

geri dilim rastgele uzunlukta ve rasgele içinde olduğu şekilde bir sıra tipi dilim pythonic yolu var mı? Örneğin, bir şey gibi:Python Rastgele Dilim Idiom

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

cevap

13

... Nasıl rastgele olan modül için dokümanlara

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

Hızlı bağlantı here bulunabilir.

4

Farkında olduğum hiçbir deyim yok, ancak random.sample ihtiyaç duyduğunuz her şeyi yapıyor.

>>> 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] 
+2

Neden aşağı oy? Literal "dilim" yorum ve amaçlanan çözüm hakkında bilgi için –

4

Sorunuz ve diğer cevapların adreslenmediği ince bir ayrım var, bu yüzden işaret etmem gerektiğini hissediyorum. Aşağıdaki örnekte gösterilmiştir. Sonuçtan da görebileceğiniz gibi

>>> random.sample(range(10), 5) 
[9, 2, 3, 6, 4] 
>>> random.sample(range(10)[:5], 5) 
[1, 2, 3, 4, 0] 

, ilk sürümü değil, "dilim" listesi, ancak yalnızca örnekleri yapar dönüş değerleri Listenin herhangi arasında olabilir böylece. Bunun yerine

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

, sen olacaktır: kelimenin tam anlamıyla listesinin bir "dilim" - isterseniz aşağıdaki istediğini yapmaz - Eğer örnek alınmadan önce numune alan sınırlamak istiyorsanız yani, böyle bir şey yapmak zorunda:

sample_len = random.randint(1, len(l)) 
random.sample(l[:sample_len], sample_len) 

Ama bunu yapmak için daha iyi bir yolu şöyle olacağını düşünüyorum:

shuffled = l[:random.randint(1, len(l))] 
random.shuffle(shuffled) 

Maalesef shuffle hiçbir kopyalamaya karşı dönen versiyonu var ben farkındayım (ör. shuffled, sorted'a benzer).

+0

+1. –

+0

@senderle 'shuffled = lambda p: örnek (p, len (p))' ' –