Есть ли способ вывести сумму последовательных одинаковых элементов в списке?

#python #list

#питон #Список

Вопрос:

Я ищу способ вывести сумму последовательных одинаковых элементов в списке.

Есть ли лучший код для этого? Мой код отсутствует, чтобы дать последний результат! Есть какие-нибудь советы?

[Код]

 lst=[' 1', '-1', '-1', '-1', ' 1', '-1', ' 1', ' 1'] output=[] s=int(lst[0]) for i in range(1,len(lst)):  if lst[i]==lst[i-1]:  s =int(lst[i])  else:  output.append("{0: }".format(s))  s=int(lst[i])  print(output)  

[Ввод]

 [' 1', '-1', '-1', '-1', ' 1', '-1', ' 1', ' 1']  

[Ожидаемый результат]

 [' 1', '-3', ' 1', '-1', ' 2']  

[Текущий неполный выход]

 [' 1', '-3', ' 1', '-1']  

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

1. Входные данные всегда представляют собой список символов, и вы хотите, чтобы выходные данные были одинаковыми?

2. @RobertoT, Да, это так.

Ответ №1:

Вы можете использовать itertools.groupby

 gt;gt;gt; from itertools import groupby gt;gt;gt; gt;gt;gt; a = [' 1', '-1', '-1', '-1', ' 1', '-1', ' 1', ' 1'] gt;gt;gt; gt;gt;gt; result = [sum(map(int, group)) for key, group in groupby(a)] gt;gt;gt; result [1, -3, 1, -1, 2]  

Но обратите внимание, что это вернет список целых чисел, но вы можете повторить результат еще раз, чтобы отформатировать его

 gt;gt;gt; [f"{' ' if r gt; 0 else ''}{r}" for r in result] [' 1', '-3', ' 1', '-1', ' 2']  

Ответ №2:

Вам также нужно отслеживать свой current_element при подведении итогов. А также сумма должна быть добавлена в конец после цикла for.

 lst = [' 1', '-1', '-1', '-1', ' 1', '-1', ' 1', ' 1'] lst = [int(i) for i in lst]  output = [] s = lst[0] current_element = lst[0] for i in range(1,len(lst)):  if current_element == lst[i]:  s  = lst[i]  else:  output.append("{0: }".format(s))  s = lst[i]  current_element = lst[i] output.append("{0: }".format(s))   print(output)  

Ответ №3:

Может быть, использовать grupby от itertools :

 from itertools import groupby  lst=[' 1', '-1', '-1', '-1', ' 1', '-1', ' 1', ' 1'] result = [f"{sum(map(int, l[1])): }" for l in groupby(lst)]  

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

1. Может быть [f"{sum(map(int, g)): }" for _, g in groupby(lst)] , было бы понятнее.