Как вернуть самую длинную подпоследовательность, образованную последовательными числами в списке Python?

#python

#python

Вопрос:

Я могу вычислить длину самой длинной возрастающей подпоследовательности, образованной последовательными числами в списке, или наибольшей суммы любой подпоследовательности. Тем не менее, я немного затрудняюсь распечатать самую длинную подпоследовательность с последовательными числами (например: 8,9,10,11,12). Как я могу это сделать? Должен ли я создавать пустой список и переопределять значения каждый раз, когда значение num проверяется в new_list?

Заранее спасибо, lanuit72

 
    def longest_largest_seq(list):
       
        list = [5,6,3,8,3,4,9,8,10,12,11,99,98]
    
        largest = 0
        sum = 0
        new_list = set(list) #using set to get unique value from the list
        max_count = 0
        count = 0
    
        for num in list:
            if num - 1 not in new_list:
                sum = 0
                count = 0
                while num in new_list:
                    sum  = num
                    count  = 1
                    num  = 1
    
                    if sum > largest:
                        largest = sum
                    if count > max_count:
                        max_count = count
        return largest, max_count
    
    print(f'Largest consecutive sum and longest consecutive subsequence', longest_largest_seq(list))

 
 

Комментарии:

1. что именно вы спрашиваете? что вы подразумеваете под подпоследовательностью? Все ли целые числа меньше наибольшего значения?

2. «Должен ли я создавать пустой список и переопределять значения каждый раз, когда значение num проверяется в new_list?» Да, у вас правильная идея, чтобы вернуть список в конце, вам нужно будет сохранить его, обычно в переменной.

3. У @Baryon есть справедливый вопрос об уточнении того, за каким свойством должна следовать ваша подпоследовательность (это последовательные возрастающие числа?)

4. Вам необходимо указать свойство подпоследовательности, как если бы оно было возрастающим или убывающим

5. Спасибо, что спросили Бариона и Адама Берка. Я спрашивал о том, как напечатать самую длинную последовательную подпоследовательность. В этом примере исходный список = [5,6,3,8,3,4,9,8,10,12,11,99,98], а самая длинная последовательная подпоследовательность равна 8,9,10,11,12

Ответ №1:

Что-то вроде этого?

 from more_itertools import consecutive_groups

a_list = [5,6,3,8,3,4,9,8,10,12,11,99,98]
sorted_list = sorted(a_list)

grouped = [list(i) for i in consecutive_groups(sorted_list)]

for i in grouped:
    print(i)

print('n', max(grouped, key=len), sep='')
 
 [3]
[3, 4, 5, 6]
[8]
[8, 9, 10, 11, 12]
[98, 99]

[8, 9, 10, 11, 12]
 

Комментарии:

1. Спасибо Генри. Это работает для отсортированного списка. Но для несортированного списка, я думаю, мы должны использовать хэш-карту или словарь для отслеживания чисел, верно?

Ответ №2:

Я думаю, это то, что вы хотите?

 import copy

seq = sorted([5,6,3,8,3,4,9,8,10,12,11,99,98])

sub_seq1 = []
sub_seq2 = []

for index, num in enumerate(seq):
    if index < len(seq) - 1:
        if num   1 == seq[index   1]:
            sub_seq2.append(num)
        else:
            sub_seq2.append(num)

            if len(sub_seq2) > len(sub_seq1):
                sub_seq1 = copy.deepcopy(sub_seq2)

            sub_seq2.clear()


print(sub_seq1)
 

Комментарии:

1. Это печатает [8, 9, 10, 11] .

2. Спасибо, Барион. Как и решение Генри, это работает для отсортированного списка. Но для несортированного списка, я думаю, мы должны использовать хэш-карту или словарь для отслеживания чисел, верно?

3. Случается, что новая версия получает это правильно, но если я удаляю 10, она печатает [11, 12] вместо [3, 4, 5, 6] .

4. Вы могли бы использовать алгоритм сортировки, чтобы сделать то же самое, что я себе представляю.