2015-02-09 92 views
-3

編輯:對那些沮喪的人:我完全清楚我不想要代碼,並且我已經自己嘗試過了。我所尋找的只是對數學過程產生樣本結果的解釋。Python:查找唯一字符串的唯一子序列

第一個問題。我做了大量的研究並最終訴諸問題,所以如果我錯過了某個地方的答案,我很抱歉。我有一個問題我真的很掙扎:

編寫Python 3腳本,需要三個命令行參數:

1.包含N個字符串通過空格分開 一個文本文件的名稱。
2.一個正整數k。
3.腳本創建的 文本文件的名稱,用於存儲來自輸入 文件的n個字符串中的k個唯一字符串的所有可能的 子序列,每行一個子序列。

例如,假設 命令行是gen.py input.txt中3和output.txt的input.txt中 該文件包含以下行:

的Python爪哇C++的Java的Java的Python

然後該程序應該創建文件output.txt的含有 以下行(以任何次序):

的Python爪哇C++
的Python C++的Java
爪哇C++的Python
C++的Java的Python

的 組合應該與實施 發生器本功能來生成離子(即使用關鍵字yield)。



從我的理解,基於樣本輸出這並不完全遵循子的定義;它們也不是排列組合,所以我不知道如何去做這件事。我知道如何做文件IO和命令行參數部分,我只是無法得到正確的子序列。我不需要一個直接的答案,因爲我應該解決這個問題,但如果有人能給我一些有用的見解,它將不勝感激。

+0

在這個例子中輸出,爲什麼沒有'Java的Python的C++'和'C++的Python Java'禮物? – 2015-02-09 03:13:13

+0

這是我的問題的來源:我可以很容易地編寫代碼,在上面的示例輸出中生成4個字符串的代碼。我相信這兩個因爲原始字符串的順序而不包括在內。因爲中間沒有「Python」的子序列。 – m7mansfield 2015-02-09 03:17:10

+0

我假設你不能使用'itertools。組合「爲你做到這一點,但這就是你如何做到這一點...... – 2015-02-09 03:24:10

回答

1

如果你允許使用itertools:

import itertools 
import sys 

def unique_substrings(txt_lst:list, k:int) -> set: 
    return set([' '.join(combo) for combo in itertools.combinations(txt_lst, 3) \ 
       if len(set(combo))==3]) 

if __name__ == "__main__": 
    infile, k, outfile = sys.argv[1:] 
    with open(infile) as inf: 
     txt_lst = infile.read().split() 
    with open(outfile) as outf: 
     for line in unique_substrings(txt_lst, k): 
      outf.write(line + "\n") 

但是從你的老師的評論:

的組合應該與你實現一個發生器功能來產生(即使用關鍵字產量)。

它看起來並不像是真正的工作。

itertools.combinations可以用近似的東西重新實現以下(from the docs)

def combinations(iterable, r): 
    # combinations('ABCD', 2) --> AB AC AD BC BD CD 
    # combinations(range(4), 3) --> 012 013 023 123 
    pool = tuple(iterable) 
    n = len(pool) 
    if r > n: 
     return 
    indices = list(range(r)) 
    yield tuple(pool[i] for i in indices) 
    while True: 
     for i in reversed(range(r)): 
      if indices[i] != i + n - r: 
       break 
     else: 
      return 
     indices[i] += 1 
     for j in range(i+1, r): 
      indices[j] = indices[j-1] + 1 
     yield tuple(pool[i] for i in indices) 
+0

我很欣賞答案,但我仍然感到困惑。我認爲他的樣本輸出不是一個組合或排列?因爲這兩套解決方案都不能滿足樣本輸出,所以你能解釋你的解決方案嗎? – m7mansfield 2015-02-09 03:46:24

+0

@ m7mansfield它是一個組合。你爲什麼認爲它不是? – 2015-02-09 03:54:38

+0

嗯,我認爲這是某種修改的排列,因爲順序很重要,不是嗎?我知道你的解決方案的作品,我只是想了解。 – m7mansfield 2015-02-09 03:59:33