Как суммировать последовательные дубликаты в списке? - PullRequest
1 голос
/ 11 июня 2019

Я делаю некоторые практические проблемы в интернете, чтобы подать заявку на стажировку, и попал в тяжелую.Проблема в сумме последовательных одинаковых чисел.

пример: [1,1,3,4,4,5] ---> [2,3,8,5]

 def sum_consecutive(s):
    p = []
    for i in range(len(s)):
        if s[i] == s[i-1]:
            p.append(s[i] + s[i-1])
            p.remove(s[i])
        elif s[i] != s[i-1]:
            p.append(s[i])
    return p

при запуске кода выше на [1,4,4,4,0,4,3,3,1] он должен вернуть [1,12,0,4,6,1], вместо этого он возвращает

в sum_consecutive (s)

    if s[i] == s[i-1]:
             p.append(s[i] + s[i-1])
             p.remove(s[i]) #This line is the problem
    elif s[i] != s[i-1]:
             p.append(s[i])

Ошибка:

ValueError: list.remove(x): x not in list

Ответы [ 3 ]

5 голосов
/ 11 июня 2019

Используйте переменную для отслеживания последнего увиденного значения, затем добавьте его к текущему индексу, если он такой же.

def sum_consecutive(s):
    p = s[:1]   # final list
    cur = s[0]  # keep track of last seen value

    for i in s[1:]:  # your exercise: replace this with `range` 
        if i == cur:
            p[-1] += i
        else:
            p.append(i)
            cur = i

    return p

sum_consecutive([1, 4, 4, 4, 0, 4, 3, 3, 1])
# [1, 12, 0, 4, 6, 1]

Asбонус, давайте не будем забывать, что stdlib существует, поэтому вы можете использовать itertools.groupby, чтобы сделать это в одну строку.

from itertools import groupby
[sum(g) for _, g in groupby([1, 4, 4, 4, 0, 4, 3, 3, 1])]
# [1, 12, 0, 4, 6, 1]
2 голосов
/ 11 июня 2019
def sum_consecutive(input_list):
i = 0
res = []
while(i < len(input_list)):
    j = i
    while(j < len(input_list) and input_list[i]==input_list[j]):
        j = j + 1

    res.append(input_list[i]*(j-i))
    i = j
return res
0 голосов
/ 25 июля 2019

Я написал эту функцию, она может быть интересной, поскольку ее очень легко понять:

def count_occ(L):
    p = []
    count = 1
    for i, j in zip(L[:-1], L[1:]):
        if i != j:
            p.append(count*i)
            count = 1
        else:
            count += 1
    p.append(count*L[-1])
    return p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...