2017-02-21 8 views
0

Pythonで二次シーケンスを作成する必要があります。Pythonの二次シーケンス

4つのオプションのケース[1,2,3,4]があります。 それぞれのケースが同じように頻繁に発生する場合は、私は素晴らしいだろう。それができない場合は、よく...

重要なことに、私は二次注文を管理したいと思います。 これは次のことを意味します:最後の2つの数字に応じて、2つの数字だけが続くことができます。

この配列が[...1,1,...]の場合、3または4のみが可能です。 シーケンスが[...3,4,...]の場合、1または2のみが可能です。 [すべての可能性に対してこれらの制限があります。もちろん。しかし、私はそれらの2つのコードがある場合、残りのためにそれを適応させることができると思います。]

シーケンスは、caの長さでそのように見えるはずです。 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

最初可能次の要素を示し辞書構築することができる:これは、前の数字は(1,1)ある所与、その後、次の要素が(3,4)(SO 3または4)のいずれかであることを意味する

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

を。次に、シーケンスを生成することができます。あなたが最初の数字について何も指定しなかったので、私はこれらがランダムと仮定します。あなたは構築することができます:

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個の要素を生成し、リストにそれらを配置する必要があります。 1はでこれを行う場合は

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 

1を取得:あなたがこれを行うことができ、ここで

>>> 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 ollowed by 1。もちろん、これは動作することを示す小さな例です。 nextの制約のため、このリストは最終的には最終的に崩壊するでしょう。...,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、)} 'その場合、システムは最後に1つしか生成できません。 –