2017-02-21 96 views
0

我需要在python中创建二阶序列。Python中的二阶序列

有4个可选案例[1,2,3,4]。 如果每个案件经常发生,我会很棒。如果这是不可能的,那么...

重要的是,我想控制二次排序。 这意味着:根据最后两个数字,只允许跟随两个数字。

我给出两个例子: 如果序列是[...1,1,...]只有3或4是可能的。 如果序列是[...3,4,...]只有1或2是可能的。 [我有这些限制的所有可能性。当然。但我认为,当我有两个代码我可以适应其余的。]

该序列应该看起来像这样的长度约。 120例: seq = [2,4,3,3,1,3,2,...]

任何建议如何创建这样一个序列?

+0

是否先前元素的顺序关系:说序列'[...,4,3,...]'是唯一的可能性仍然1和2. –

+0

有什么和Python有关的,我们可以帮忙吗?现在这不是一个规格问题。 – DSM

+0

@Willem Van Onsem:是的,订单很重要。例如。[...,4,3,...]只有3和4. [... 3,4,...]只有1和2. – SDahm

回答

1

可以先构造一个字典,显示了可能的下一个元素:

nexts = { 
     (1,1):(3,4), 
     (3,4):(1,2), 
     # ... 
     } 

因此,这意味着给定的先前的数字是(1,1),然后下一个元素是(3,4)一个(SO 3或4)。接下来我们可以生成一个序列。既然你没有指定任何关于第一个数字的事情,我会假设这些是随机。您可以构建:

from random import choice 

def second_order_random(k,next_dic): 
    n0 = choice(range(1,k+1)) 
    yield n0 
    n1 = choice(range(1,k+1)) 
    yield n1 
    while True: 
     (n0,n1) = (n1,choice(next_dic[(n0,n1)])) 
     yield n1 

这是一个无限发生器将根据您nexts规格产量构成因素。另一方面,k指定数字的范围(此处为k=4)。所以,当你调用second_order_random(4,nexts),您可以生成形式的序列:

3,4,2,... 
1,1,4,... 
1,1,3,... 
3,4,1,... 

现在你只需要生成从发电机120元,并把它们在列表中。你可以这样做:

from iteratools import islice 

result = list(islice(second_order_random(4,nexts),120)) 

如果一个做到这一点有:

nexts = {(1,1):(2,),(1,2):(1,2),(2,1):(1,),(2,2):(1,)} 
k = 2 

一个实例都有:

>>> list(islice(second_order_random(k,nexts),10)) 
[1, 1, 2, 2, 1, 1, 2, 2, 1, 1] 

所以nexts这里指定(1,1)总是跟着一个2 ,该(1,2)可以跟随任何数字,并且(2,1)(2,2)总是f被1贬低。这当然是一个小例子来证明它的工作原理。由于next限制,这名单总是崩溃最终TOT ...,1,1,2,2,1,1,2,2,1,1,2,2,...

+0

这工作正常。 的nextS = { \t \t(1,1):(3,4), \t \t(1,2):(3,4), \t \t(1,3):(1,2), \t \t(1,4):(1,2), \t \t(2,1):(1,2), \t \t(2,2):(1,2), \t \t(2, 3):(3,4), \t \t(2,4):(3,4), \t \t(3,1):(3,4), \t \t(3,2):(3,4), \t \t(3,3):(1,2), \t \t(3,4):(1,2), \t \t(4, 1):(1,2), \t \t(4,2):(1,2), \t \t(4,3):(3,4), \t \t(4,4):(3 ,4), \t \t} – SDahm

+0

您是否还看到一个选项来控制每个数字的频率。所以每一个都经常发生? – SDahm

+0

@SDAHM:它将统一挑出“下一个”可能的状态。这是不可能的:如果你有'nexts = {(1,1):(1,),(1,2):(1,),(2,1):(1,),( 2,2):(1)}'。在这种情况下,系统最终只能生成一个。 –