2016-09-23 46 views
1

在假設隨機抽樣,有一個corresponding sampled_from() strategyrandom.choice()與假說

In [1]: from hypothesis import find, strategies as st 

In [2]: find(st.sampled_from(('ST', 'LT', 'TG', 'CT')), lambda x: True) 
Out[2]: 'ST' 

但是,有一種方法來有random.sample()樣的策略,以產生長度爲N個子序列進行序列的?

In [3]: import random 

In [4]: random.sample(('ST', 'LT', 'TG', 'CT'), 2) 
Out[4]: ['CT', 'TG'] 

回答

1

你可以這樣做:

permutations(elements).map(lambda x: x[:n]) 
+0

簡單得多,再次感謝! – alecxe

1

感覺這應該可以用lists策略,但我不能讓它工作。通過編寫代碼sampled_from,我能夠做出似乎可行的事情。

from random import sample 
from hypothesis.searchstrategy.strategies import SearchStrategy 
from hypothesis.strategies import defines_strategy 


class SampleMultipleFromStrategy(SearchStrategy): 
    def __init__(self, elements, n): 
     super(SampleMultipleFromStrategy, self).__init__() 
     self.elements = tuple(elements) 
     if not self.elements: 
      raise ValueError 
     self.n = int(n) 

    def do_draw(self, data): 
     return sample(self.elements, self.n) 

@defines_strategy 
def sample_multiple_from(elements, n): 
    return SampleMultipleFromStrategy(elements, n) 

樣品結果:

>>> find(sample_multiple_from([1, 2, 3, 4], 2), lambda x: True) 
[4, 2] 
+1

請不要做這種方式。 a)從SearchStrategy繼承是一個內部API。繼承結構不穩定。 b)在策略中使用隨機方法將工作,但不會正確地最小化。 – DRMacIver