2016-11-25 13 views
0

質問:サブシーケンスPythonを抽出する

数字のシーケンスが与えられている場合、昇順に並べられた最大長のサブシーケンスを抽出します。

例入力:L = [1,3,5,6,1,5,1,6,7]

出力:[1,3,5,6]

コード:

def Sequence(integers): 


sequence = [] 
i = 0 
stored = [] 
#newseq = [] 

for i in range(len (integers)-1) : 

    if integers[i] <= integers[i+1]: #i less than i+1 append to sequence 
     stored.append(integers[i]) 
     sequence.append(integers[i]) 

    else: 
     if integers[i] >= integers[i+1]: 

      del sequence[:] 

    if len(stored) > (len(sequence)): 
     print('biggest subseq =',stored) 
     print('small sub',sequence) 

print (stored,sequence) 

Sequence([1,2,3,4,5,1,2,4,5]) 

エラー:

それは[1, 2, 3, 4, 1, 2, 4] [1, 2, 4]

を出力している。しかし、それは出力する必要があります:[[1, 2, 3, 4,5] [1, 2, 4, 5]

どうすればこの問題を解決できますか?

答えて

1

once this works I can display the biggest subsequence. any ideas?

私の考えは、動作しないことです。あなたはそれをかなり書き直す必要があります。

数字(for i in ...)をループすることから始めます。これは最初のifテストでは、これまでのところ増加している数字の実行を取り上げています。しかし、数字をstoredsequenceの両方に追加します。なぜ両方に同じことを追加するのですか?

次に、シーケンスが増加しなくなると、elseがトリガされます。それはクールです、あなたは増加するシーケンスに従い、終了時に気付くことができます。しかし、あなたはそれを信じていないし、別のifと同じテストをやり直すのは...なぜですか?そこで、sequenceを削除します。 "私はすべてのシーケンスを追跡し、終了時には、私が探しているものを投げ捨てることはちょうどいいからです:"。

[OK]をあなたが与えた名前から、私はsequenceは "の作業中の現在のシーケンス"になるはずです。

これらのifテストの後、ループの繰り返しごとにlen(stored)をチェックします。 storedは決してクリアまたはリセットされないので、元のリストのほとんどすべての番号が作成されます。その長さのテストをしたら...あなたは何もしません、印刷物を除いて。あなたは、印刷何

print('biggest subseq = ', sequence) - それは名前sequenceのように見えるが、「最大」のはずが、それはあなたが以前にそれを使用する方法に比べて悪いのです。 sequenceは最大のものではありませんが、現在のものですよね?そうでないか? "長い名前を入力するのが好きではないので、役に立たない名前を使用します。なぜコードが機能しないのですか?"。ええ、私はいつもそうしています。

次に、storedが「小さなサブ」であることを印刷しますか?小さなサブとは何ですか?どんなものであろうと、storedはこの時点で有用なものを保持していません。

そして、番号i >= i+1を追跡していて、一致するときにシーケンスにiを追加するだけで、すべてのシーケンスの最後の番号が常に失われることになります。 (「次のものは小さいので、これを追加するのをスキップします」)。

range(len(integers) - 1)を追跡する方法は、元のリストの最後の番号を最終的なサブシーケンスに決してチェックしないことを意味します。

だから、単純な修正はあなたのコードではうまくいかないでしょう。実行可能な答えのために正しい行に沿っていますが、実際には正しいことをしていません。


私は新しいものを保存し、その後、次のシーケンスを見つける。それは長い前回格納されている1つ以上ある場合。あなたが何をしようとしていること「のシーケンスが終了するまで一緒にトラックであると思うし、それを保存します代わりに "。したがって:

  1. わかりやすい変数名は、その内容を説明してください。

  2. storedあなたが見つけたシーケンス全体に一度設定してください。表示されているときに個別の番号を追加する必要はありません。

  3. 入力リストのすべての番号ではなく、シーケンスが終了するポイントで発生する必要があります。

  4. つまり、storedの更新がif len(stored) > len(sequence)の内部で発生する必要があります。

  5. ..もう一方の方法をテストする必要があります。これは、保存されているものより新しいものです。

  6. そして、ストアを更新するための処置が必要です。

私ができるよう、私に取得するあなたのコードの近くに、それを書き込もうとしましたこの:

def Sequence(integers): 

    longest_sequence = [] 
    current_sequence = [] 

    for i in range(len(integers)): 

    if i < len(integers) - 1 and integers[i] <= integers[i+1]: # sequence continues 
     current_sequence.append(integers[i]) 
     print('current_sequence ', current_sequence) 

    else:       # else sequence, or input, ends now 
     current_sequence.append(integers[i]) # catch this last number in sequence, too 
     print('\nsubseq ended ', current_sequence) 

     # now we've hit the end of a subsequence 
     # do we replace the stored one, or not? 
     if len(current_sequence) > len(longest_sequence): 
     print('\nreplacing previous longest ', longest_sequence) 

     longest_sequence = current_sequence 

     # either way, reset the current sequence tracker 
     current_sequence = [] 

    print() 
    print ('Finished. Longest found: ', longest_sequence) 


Sequence([1,2,3,4,5,1,2,4,5]) 
print('\n----\n') 
Sequence([1,2,4,5,1,2,3,4,5]) 

あなたはどちらrun online at repl.it hereをすることができます。

関連する問題