-3

編集:反対票を投じた人々へ:コードが欲しくないこと、そしてすでに自分で試したことがあることは完全に明らかでした。私が探していたのは、サンプルの結果が得られた数学的プロセスの説明だけでした。

最初の質問。私は多くの調査を行い、最終的に尋ねることに頼ったので、どこかで答えを逃した場合はお詫び申し上げます. 私は本当に苦労している問題があります:

3 つのコマンド ライン引数を取る Python 3 スクリプトを作成します

。 1. 空白で区切られた n 個の文字列を含むテキスト ファイルの名前。
2. 正の整数 k。
3. 入力ファイルからの n 個の文字列から k 個の一意の文字列のすべての可能なサブシーケンス (1 行に 1 つのサブシーケンス) を格納するために、スクリプトが作成するテキスト ファイルの名前。

たとえば、コマンド ラインが gen.py input.txt 3 output.txt で、ファイル input.txt に次の行が含まれているとします。

Python Java C++ Java Java Python

次に、プログラムは次の行を含むファイル output.txt を作成する必要があります (

Python Java C++ Python
C++ Java
Java C++ Python
C++ Java Python

組み合わせは、ジェネレーター関数の実装 (つまり、yield キーワードを使用) で生成する必要があります。



私の理解では、サンプル出力に基づくと、これはサブシーケンスの定義に完全に従っていません。また、完全な順列でもないので、どうすればいいのか途方に暮れています。ファイル IO とコマンド ライン引数部分の実行方法は知っていますが、正しいサブシーケンスを取得できません。これを解決することになっているので、直接の回答は必要ありませんが、誰かが私に役立つ洞察を与えることができれば、それは大歓迎です.

4

1 に答える 1

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")

ただし、インストラクターのコメントから:

組み合わせは、ジェネレーター関数の実装 (つまり、yield キーワードを使用) で生成する必要があります。

それが実際にうまくいくようには見えません。

itertools.combinations次のようなもので再実装できます(ドキュメントから)

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)
于 2015-02-09T03:34:43.050 に答える