2017-02-21 92 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)}'。在這種情況下,系統最終只能生成一個。 –