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