2012-06-24 4 views
3

Я хочу написать функцию, которая принимает список чисел и возвращает суммарную сумму; то есть новый список, в котором i-й элемент представляет собой сумму первых i + 1 элементов из исходного списка. Например, суммарная сумма [1, 2, 3] равна [1, 3, 6].Можете ли вы помочь мне в этом упражнении на питоне?

Вот мой код до сих пор:

def count(list1): 
    x = 0 
    total = 0 
    while x < len(list1): 
     if x == 0: 
      total = list1[0] 
      print total 
      x = x +1 
     else: 
      total = list1[x] + list1[x -1] 
      print total 
      x = x + 1 
    return total 

print count([1, 2, 3, 4, 7]) 

ОДНАКО, он не работает.

Можете ли вы сказать мне, что я делаю неправильно? Я работал над этим довольно долгое время.

большое спасибо!

Люк

+1

Этот код более сложный, чем это должно быть:/ –

+4

«Я не очень умный». Не путайте недостаток опыта с отсутствием интеллекта, или будьте обеспокоены тем, что * мы их путаем и поэтому чувствуем, что вам нужно заранее извиниться за то, что вы что-то не поняли. Каждый был новичком один раз, и люди не рождаются, зная Python. Пока еще нет. – DSM

+0

'itertools.accumulate' – JBernardo

ответ

9

Возможно, вы немного передумали. Логика не обязательно должна быть разделена на случайные тесты. До сих пор часть, на которую вы имеете право, - это общий счетчик, но вам нужно всего лишь перебрать каждое значение в списке. Не делайте условного while, с if..else

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

def count(l): 
    total = 0 
    result = [] 
    for val in l: 
     total += val 
     result.append(total) 
    return result 

Мы по-прежнему используем общий счетчик. И мы создаем пустой список для наших результатов. Но все, что нам нужно сделать, это цикл над каждым элементом в списке, добавление к сумме и добавление нового значения каждый раз. Условных нет, и вам не нужно беспокоиться о том, когда while собирается сломаться. Согласитесь, что вы будете перебирать каждый элемент в своем исходном списке.

+0

Большое спасибо за этот ответ! Это имеет большой смысл! Я читаю книгу Think Python: как думать, как компьютерный ученый И я все время узнал об этом. Большое спасибо еще раз! Вы были очень полезны! –

+0

@ LukeD: Нет проблем! Я полагал, что это было очень близко к терминологии, к которой вы, вероятно, дошли до сих пор. Удачи! Дайте мне знать, если вам нужно больше разъяснений по этому поводу. – jdi

+0

Я сэра. Еще раз спасибо, вы были очень полезны. Мне пришлось подумать об этом по-другому, как вы это делали. Спасибо. –

1

Один простой подход может быть

>>> given_list = [1, 4, 5, 8] 
>>> output_list = [sum(given_list[:num]) for num in range(len(given_list)+1)] 
>>> output_list 
[0, 1, 5, 10, 18] 
>>> output_list[1:] 
[1, 5, 10, 18] 
>>> 

Смотрите, если это работает для различного вида списка. Я оставляю это для вас.

+2

Это путь пути для новичка, и он не может получить изображение, которое получит его. – jdi

+0

Мне стыдно пытаться решить этот вопрос. – pyfunc

+0

Спасибо за предложение, pyfunc. Для меня это слишком сложно, но спасибо за вашу помощь. Если бы я был умнее, я уверен, что лучше пойму! –

1

Вы не делаете то, что хотите делать с total.

Что вы устанавливаете total является list[x] + list[x+1]. Вы действительно хотите, чтобы это была сумма все предыдущие элементы и текущий элемент.

Заменить total = list1[x] + list1[x-1] на total += list1[x].

+0

Спасибо за это предложение! Я попытался, но это не сработало. Но это окончательно помогло, и спасибо! –

2

Здесь вы добавляете текущий индекс с последним и переопределение «всего»

total = list1[x] + list1[x -1] 

Я думаю, вы хотите что-то вроде этого, он возвращает 31 для приведенного ниже списка.

def count(list1): 
    x = 0 
    total = 0 
    while x < len(list1): 
     total += list[x] 
     print total 
     x = x + 1 
    return total 

list = [1, 2, 4, 8, 16] 
print count(list) 
+0

Спасибо за ваш комментарий! Это было очень полезно! Благодаря! –

+2

Вы определили основную проблему в коде в вопросе. Однако ваша функция возвращает сумму содержимого списка, а не новый список с суммарными суммами, указанными в вопросе. – Blair

1

Это решение, которое я придумал:

def count(list1): 
    total = 0 
    old = 0 
    for position, x in enumerate(list1): 
     total = x + old 
     old = x 
     print total 
    return 


count([1,1,2,3,5,8,13]) 
+0

спасибо Jon за форматирование этого =) – Ray

1

Вам не нужно писать эту функцию.Он расположен в модуле itertools:

>>> list(itertools.accumulate([1,2,3])) 
[1, 3, 6] 
+0

Я думаю, что объяснение, связанное с этим кратким кодом, было бы полезно – Levon

+0

@ Levon. Имя функции (накапливать) само собой разумеется. И поскольку это генератор, я назвал его «list» – JBernardo

+0

Да, * Я * знаю, что .. учитывая проблемы с OP, я думал, что было бы полезно предоставить им минимальное (например, 1 строку) объяснение - вот и все:) Не все устраивают наши «питонические» способы ... – Levon

1

Другое решение, один-лайнер, но определенно работает (http://ideone.com/qtwh7), несмотря на то, многострочные решения яснее на то, что происходит на самом деле здесь:

data = [3, 7, 22, -3, 5, -23, 16] 

result = reduce(lambda a, b: a+[a[-1]+b], data, [0])[1:] 

print result 
+0

Это можно сделать без конкатенации: 'reduce (lambda r, x: r.append (r [-1] + x) или r, data, [0 ]) [1:] 'или даже без индексации' сокращение (лямбда (res, sum), x: (res.append (sum + x) или res, sum + x), data, ([], 0)) [0] ' – astynax

+0

мой первый (второй) вариант с' len (data) == 1000' в 7 (6) раз быстрее и больше памяти эффективен :) – astynax

+0

@astynax: Возможно, вы правы, но мне кажется странным ;) И какой порядок величины он, 7x или 76x быстрее? ;) Вы можете попытаться использовать 'map()' аналогичным образом. И он может (должен?) Быть еще быстрее. – Tadeck

0

I сделал одно и то же упражнение, и что следует за моим решением. Он использует только базовый метод списка append и оператор списка .

def accum(list): 
    """Sequential accumulation of the original list""" 
    result = [] 
    for i in range(len(list)): 
     result.append(sum(list[:i+1])) 
    return result 
Смежные вопросы