Определение групп равных последовательных элементов в списке

#python #arrays #python-3.x #arraylist

#python #массивы #python-3.x #arraylist

Вопрос:

Допустим, у нас есть отсортированный массив,

 A = [1,2,2,3,7,7,7,9]
 

Мы хотим, чтобы результат выглядел следующим образом:

 [1]

[2,2]

[3]

[7,7,7]

[9]
 

Это моя попытка:

 def func(A):

    j = 0
    for i in range(len(A)):
        result = []
        while A[i] == A[j] and j < len(A)-1:
            result.append(A[j])
            j  = 1
        if result != []:
            print(result)
 

Эта функция не включает последний элемент в списке, а также имеет время выполнения O (N ^ 2), которое я пытаюсь улучшить. Любая помощь будет с благодарностью принята.

Ответ №1:

itertools.groupby это очень удобный способ сгруппировать похожие элементы в списке:

 >>> A = [1,2,2,3,7,7,7,9]
>>> from itertools import groupby
>>> for group in groupby(A):
...     print(list(group[1]))
...
[1]
[2, 2]
[3]
[7, 7, 7]
[9]
 

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

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

Ответ №2:

вы могли бы решить свою проблему с for loop помощью и two if's :

Вот этот код:

 def func(A):
    result = []
    for i in range(len(A)):
        result.append(A[i])

        if i == len(A)-1:
            print (result)
        
        if (i != len(A)-1) and (A[i] != A[i 1]):
            print (result)
            result = []
 

Предоставленные вами входные данные:

 A = [1,2,2,3,7,7,7,9]
 

Ваш результат будет:

 [1]
[2, 2]
[3]
[7, 7, 7]
[9]
 

Ответ №3:

Вот функция с O (N) временем (по крайней мере, я уверен):

 def func(A):
    last_num = A[0]
    last_list = []
    for num in A:
        if last_num == num:
            last_list.append(num)
        else:
            last_num = num
            print(last_list)
            last_list = [num]
    print(last_list)
 

Вместо использования вложенного цикла for , это перебирает каждый элемент и сохраняет последнее число в переменной last_num . Если текущее число совпадает с предыдущим, то оно добавляется к last_list . В противном случае все сбрасывается и last_list печатается. В конце last_list снова печатается, так как после этого нет числа, чтобы активировать else оператор (который выводит список).

Ответ №4:

Это работает:

 L = len(A)
if L > 0:
    prev = A[0]
    print ("[", prev, sep="", end="")

for i in range(1,L):
    if prev != A[i]:
        print ("]")
        prev = A[i]
        print ("[", prev, sep="", end="")
    else:
        print (",", A[i], sep="", end="")
else:
    print ("]")
 

Вывод:

 [1]
[2,2]
[3]
[7,7,7]
[9]
 

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

1. Это действительно работает, но я думаю, было бы лучше, если бы вы использовали реальные списки python вместо использования строк (я почти уверен, что OP нужны списки, а не только строки).

2. @AyushGarg — Почему ты так уверен? В коде OP список, который создается, только печатается, а не возвращается. Я не вижу никакого смысла в создании списка путем повторных append() вызовов, если его целью является только печать. В любом случае, мы могли бы позволить OP прокомментировать этот аспект моего ответа.

Ответ №5:

Вы можете использовать функцию groupby , которая возвращает последовательные ключи и группы (в качестве генераторов) из итерируемого:

 from itertools import groupby

for _, group in groupby(A):
    print(list(group))