提取子序列Python

时间:2016-11-25 17:33:10

标签: list python-3.5 subsequence

问题:

给定一系列数字,提取最大长度的子序列,该子序列按升序排列。

示例输入: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 个答案:

答案 0 :(得分:1)

  

一旦这个工作,我可以显示最大的子序列。任何想法?

我的想法是它不起作用,你需要重写它。

你首先循环遍历数字(for i in ...),这很好,第一个if测试选择了一系列不断增加的数字,好了到目前为止。但是,您将数字添加到storedsequence。为什么要为两者添加相同的东西?

如果序列停止增加,else会触发。这很酷,您可以按照不断增加的顺序进行操作,并在结束时注意。但你不相信这一点,并且你再次与另一个if进行完全相同的测试,因为...原因?在那里,您删除了sequence。 “我将跟踪所有序列,当它们结束时,我会扔掉它们而不使用它们,因为扔掉我正在寻找的东西就好了。)”。

好的,从您给出的名字开始,我猜sequence应该是“我正在处理的当前序列”。

在那些if测试之后,对于每次循环迭代,检查len(stored); stored永远不会被清除或重置,因此它只会构建原始列表中的每个数字。一旦你进行了那个长度测试......除了打印东西,你什么都不做。

您打印的内容:print('biggest subseq = ', sequence) - 看起来名称sequence应该是“最大”,但与您使用它的方式相比,这是错误的早。 sequence不是最大的,它是现在的,对吧?还是不对? “我会使用无用的名字,因为我不喜欢输入长名称。为什么我的代码不起作用?”。是的,我也一直这样做。

然后你打印stored是'小子'?什么是小子?无论它应该是什么,stored在这一点上都没有任何有用的东西。

而且,您跟踪数字i >= i+1并且仅在匹配时仅添加i的方式,意味着您始终会错过每个序列中的最后一个数字。 (“下一个更小,所以我会跳过添加这个”)。

更糟糕的是,您跟踪range( len(integers) - 1)的方式意味着您永远不会将原始列表中的最后一个数字检查到最终子序列中。

所以是的,一个简单的修复程序对你的代码不起作用。这是一个可行的答案,但它完全没有做正确的事情。

我认为你要做的是“跟踪一个序列结束,并存储它。然后,找到下一个序列。如果它比之前存储的序列长,则存储新的序列”。所以:

  1. 给自己清楚的变量名称来解释它们的用途。

  2. stored中,您应该将其设置为您找到的整个序列,而不是在您看到它们时为其添加个别数字。

  3. 这需要在序列结束时发生,而不是输入列表中的每个数字。

  4. 这意味着stored的更新需要在if len(stored) > len(sequence)内进行。

  5. ..需要以另一种方式进行测试 - 新版本比存储的更长。

  6. 需要采取措施更新商店。

  7. 尽可能接近你的代码,试着写下这个:

    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