Подведите список чисел в Python - PullRequest
325 голосов
/ 06 декабря 2010

У меня есть список чисел, например [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

, чтобы получить одно число?

Это не работает дляя.

Ответы [ 22 ]

248 голосов
/ 06 декабря 2010

Вопрос 1: Итак, вы хотите (элемент 0 + элемент 1) / 2, (элемент 1 + элемент 2) / 2, ... и т. Д.

Мы составляем два списка: по одному на каждый элемент, кроме первого, и по одному на каждый элемент, кроме последнего. Тогда средние значения, которые мы хотим, являются средними значениями каждой пары, взятыми из двух списков. Мы используем zip, чтобы взять пары из двух списков.

Я предполагаю, что вы хотите видеть десятичные дроби в результате, даже если ваши входные значения являются целыми числами. По умолчанию Python выполняет целочисленное деление: он отбрасывает остаток. Чтобы разделить вещи на всем пути, нам нужно использовать числа с плавающей точкой. К счастью, деление int на число с плавающей точкой приведет к появлению float, поэтому мы просто используем 2.0 для нашего делителя вместо 2.

Таким образом:

averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]

Вопрос 2:

Это использование sum должно работать нормально. Следующие работы:

a = range(10)
# [0,1,2,3,4,5,6,7,8,9]
b = sum(a)
print b
# Prints 45

Кроме того, вам не нужно присваивать все переменной на каждом этапе пути. print sum(a) работает просто отлично.

Вам нужно будет более точно указать, что именно вы написали и как это не работает.

99 голосов
/ 06 декабря 2010

Сумма списка чисел:

sum(list_of_nums)

Вычисление половины n и n - 1 (если у меня правильный шаблон), используя понимание списка :

[(x + (x - 1)) / 2 for x in list_of_nums]

Сумма смежных элементов, например ((1 + 2) / 2) + ((2 + 3) / 2) + ... с использованием уменьшение и лямбда

reduce(lambda x, y: (x + y) / 2, list_of_nums)
64 голосов
/ 12 июля 2016

Вопрос 2: Для суммирования списка целых чисел:

a = [2, 3, 5, 8]
sum(a)
# 18
# or you can do:
sum(i for i in a)
# 18

Если список содержит целые числа в виде строк:

a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)
28 голосов
/ 12 июля 2017

Вы можете попробовать так:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)]
print(sm) # Python 3
print sm  # Python 2
24 голосов
/ 02 июня 2015
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45

Кажется, что sum было определено где-то в коде и перезаписывает функцию по умолчанию.Поэтому я удалил его, и проблема была решена.

16 голосов
/ 13 января 2016

Использование простого list-comprehension и sum:

>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
11 голосов
/ 08 января 2016

Все ответы показали программный и общий подход. Я предлагаю математический подход, специфичный для вашего случая. Это может быть быстрее, в частности, для длинных списков. Это работает, потому что ваш список представляет собой список натуральных чисел до n:

Предположим, у нас есть натуральные числа 1, 2, 3, ..., 10:

>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Вы можете использовать функцию sum в списке:

>>> print sum(nat_seq)
55

Вы также можете использовать формулу n*(n+1)/2, где n - это значение последнего элемента в списке (здесь: nat_seq[-1]), поэтому вы избегаете повторения элементов:

>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55

Для генерации последовательности (1+2)/2, (2+3)/2, ..., (9+10)/2 вы можете использовать генератор и формулу (2*k-1)/2. (отметьте точку, чтобы сделать значения с плавающей запятой). Вы должны пропустить первый элемент при создании нового списка:

>>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]]
>>> print new_seq
[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

Здесь вы также можете использовать функцию sum из этого списка:

>>> print sum(new_seq)
49.5

Но вы также можете использовать формулу (((n*2+1)/2)**2-1)/2, чтобы избежать перебора элементов:

>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5
5 голосов
/ 12 февраля 2016

Самый простой способ решить эту проблему:

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum
2 голосов
/ 16 июля 2017
import numpy as np    
x = [1,2,3,4,5]
[(np.mean((x[i],x[i+1]))) for i in range(len(x)-1)]
# [1.5, 2.5, 3.5, 4.5]
2 голосов
/ 06 декабря 2010

Генераторы - это простой способ написать это:

from __future__ import division
# ^- so that 3/2 is 1.5 not 1

def averages( lst ):
    it = iter(lst) # Get a iterator over the list
    first = next(it)
    for item in it:
        yield (first+item)/2
        first = item

print list(averages(range(1,11)))
# [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...