#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)]
, было бы понятнее.