2014-05-17 131 views
1

這是某種類型的笛卡爾產品,它是從初始固定長度的整數序列中衍生出來的,並使用符號規定的規則生成附加序列,該規則規定必須遵循的其他系列的數量。如何在python中實現這個算法?

例如(^產生附加的1系列,*產生附加的3個系列)

1 0^ 1* 1 

生成

1 0 2 1 
1 0 3 1 
1 0 4 1 (we stop here because we have produced 3 additional series) 

1 1 1* 1 (we have produced an additional series from the `^` symbol. still have the `*`) 

1 1 2 1 
1 1 3 1 
1 1 4 1 

又如,現在具有更大的長度和一系列附加的規則。

1 0^ 1* 0^ 1 

產生

1 0 2 0 1 
1 0 3 0 1 
1 0 4 0 1 

1 0^ 1* 1 1 

1 0 2 1 1 
1 0 3 1 1 
1 0 4 1 1 

1 1 1* 1 1 

1 1 2 1 1 
1 1 3 1 1 
1 1 4 1 1 

我只是無聊,開始寫了一系列的數字像這樣在紙上很好奇,想知道是否已經有一個算法或實施產生一系列這樣的序列整數。請注意,系列之間有新的界限,可以生成更多系列以便更容易理解。

+0

它隱約讓我想起了一個常規的語言規範,從中生成字符串,但使用您似乎已經發明的自定義符號。 –

回答

1

對於一般的笛卡爾產品,您可以使用itertools.product。具體來說,我將分兩個步驟實現您的算法:

  1. 將輸入字符串(例如"1 0^ 1* 0^ 1")解析爲整數列表的列表;和
  2. 產生列表的產品。

一個相對簡單的基於生成器的實現,爲清楚起見,一個輔助功能,看起來像:

def algorithm(input_): 
    # Step 1 
    instructions = [] 
    for s in input_.split(): 
     try: 
      instructions.append([int(s)]) 
     except ValueError: 
      instructions.append(list(values(s))) 
    # Step 2 
    for prod in itertools.product(*instructions): 
     yield prod 

def values(s): 
    RULES = {'*': 4, '^': 2} 
    n = int(s[:-1]) 
    for x in range(RULES[s[-1]]): 
     yield n + x 

例如:

>>> print("\n".join(" ".join(map(str, t)) for t in algorithm("1 0^ 1* 1"))) 
1 0 1 1 
1 0 2 1 
1 0 3 1 
1 0 4 1 
1 1 1 1 
1 1 2 1 
1 1 3 1 
1 1 4 1 

你將不得不與它鼓搗獲得您要查找的精確順序(您似乎有一個運算符,而不是從左到右,優先)和格式(例如組之間的空格)。

+0

耶基本'1 0 1 1'等於'列表(1,0,1,1)'。 'itertools'似乎要完成這項工作 – KJW