Дополнительно
Суммирование списка чисел в Python
У меня есть список чисел типа [1,2,3,4,5...]
, и я хочу вычислить (1+2)/2
, а для второго (2+3)/2
, а для третьего,
(3+4)/2
, и так далее. Как мне это сделать?
Я хочу сложить первое число со вторым и разделить его на 2, затем сложить второе с третьим и разделить на 2, и так далее.
Кроме того, как можно просуммировать список чисел?
a = [1, 2, 3, 4, 5, ...]
Это:
b = sum(a)
print b
, чтобы получить одно число?
У меня это не работает.
342
20
Вопрос 1: Итак, вы хотите получить (элемент 0 + элемент 1) / 2, (элемент 1 + элемент 2) / 2, ... и т.д.
Составим два списка: один из всех элементов, кроме первого, и один из всех элементов, кроме последнего. Тогда искомые средние - это средние по каждой паре, взятые из этих двух списков. Для извлечения пар из двух списков мы используем функцию
zip
.Я предполагаю, что вы хотите видеть десятичные числа в результате, хотя ваши входные значения являются целыми числами. По умолчанию Python выполняет целочисленное деление: он отбрасывает остаток. Чтобы делить до конца, нужно использовать числа с плавающей точкой. К счастью, при делении int на float получается float, поэтому в качестве делителя вместо
2
мы просто используем2.0
.Таким образом:
Вопрос 2:
Такое использование
sum
должно работать нормально. Работает следующее:Также не обязательно присваивать все переменной на каждом шаге.
print sum(a)
работает просто отлично.Вам необходимо уточнить, что именно вы написали и как это не работает.
Суммарный список чисел:
Вычисление половины n и n - 1 (если я правильно понял шаблон), используя list comprehension:
Суммирование смежных элементов, например, ((1 + 2) / 2) + ((2 + 3) / 2) + ... с использованием reduce и lambdas.
Вопрос 2: Суммировать список целых чисел:
Если список содержит целые числа в виде строк:
Вы можете попробовать этот способ:
Похоже, что
сумма
была определена где-то код и переписывает функцию по умолчанию. Так что я удалил его и проблема была решена.Используя простой список-понимание
и
сумма`:Все ответы не показывать программных и общий подход. Я предлагаю математический подход конкретно для вашего случая. Это может быть быстрее, в частности для длинных списков. Это работает, потому что ваш список-это список из натуральных чисел до
Н
:Позвольте'ы предположим, у нас есть натуральные числа
1, 2, 3, ..., 10
:Вы можете использовать функцию
сумма
на список:Вы также можете использовать формулу
Н*(Н+1)/2
, гдеN
является значение последнего элемента в списке (здесь:nat_seq[-1]
), Так что вам избежать перебора элементов:Для генерации последовательности
(1+2)/2, (2+3)/2, ..., (9+10)/2
Вы можете использовать генератор и Формуле(2*к-1)/2.
(обратите внимание на точку, чтобы значения с плавающей запятой). Вы должны пропустить первый элемент при создании нового списка:Здесь, вы можете использовать функцию
сумма
в этом списке:Но вы также можете использовать формулу
(((н*2+1)/2)**2-1)/2
, Так вы сможете избежать перебора элементов:Самый простой способ решить эту проблему:
Давайте сделаем его легким для начинающих:-
Эта концепция называется слежка
Выходов = 15
Коротко и просто:
И здесь's, как она выглядит:
Из-за некоторой глупости в том, как питон обрабатывает "карта" над двумя списками, вы должны усекать список, а[:-1]
. Он работает больше, как вы'd не ожидала, если использовать модуле itertools.протокол IMAP
:Используя попарное` рецепт модуле itertools:
Генераторы простой способ, чтобы написать это:
Я использовать
а
петли, чтобы получить результат:Цикл по элементам списка и обновление всего такой:
Спасибо Карл Knechtel я смог понять ваш вопрос. Моя интерпретация:
Первый вопрос, используя анонимную функцию (ака. Функция Lambda):
с = лямбда-л: [(л[0]+Л[1])/2.] + с(Л[1:]) Если LEN(л)>1 еще [] #если вы хотите результат как поплавок с = лямбда-л: [(л[0]+Л[1])//2] + С(Л[1:]) Если LEN(л)>1 еще [] #если вы хотите, чтобы пол в результате
Второй вопрос также использование анонимной функции (ака. Функция Lambda):
Р = лямда-л: л[0] + р(л[1:]) Если л!=[] еще 0
Оба вопросы объединены в одну строку кода :
с = лямбда-л: (л[0]+Л[1])/2. + с(Л[1:]) Если LEN(л)>1 иначе 0 #если вы хотите результат как поплавок с = лямбда-л: (л[0]+Л[1])/2. + с(Л[1:]) Если LEN(л)>1 иначе 0 #если вы хотите, чтобы результат пол
используйте тот, который лучше всего соответствует вашим потребностямЯ'd, просто использовать лямбда с картой()
В духе модуле itertools. Вдохновение из попарно рецепт.
Примеры:
Попробуйте использовать списочное понимание. Например: