2010-12-06 3 views
201

Если у меня есть список номеров, таких как [1,2,3,4,5...] и я хочу, чтобы вычислить (1+2)/2 и для второго, (2+3)/2 и третий, (3+4)/2 и так далее.сумма список номеров в Python

Как я могу это сделать? Я хотел бы суммировать первое число со вторым и разделить его на 2, затем суммировать второе с третьим и делить на 2 и т. Д.

Также, как я могу суммировать список чисел?

a = [1,2,3,4,5,...] 

ли:

b = sum(a) 
print b 

, чтобы получить один номер? Это не работает для меня. Помогите мне пожалуйста.

+0

Как долго этот список? насколько случайными являются значения, от 0 до 1? – kevpie 2010-12-06 08:04:29

ответ

66

Сумма список номеров:

sum(list_of_nums) 

Расчет половины п и п - 1 (если у меня есть образец правильного), используя list comprehension:

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

Sum соседние элементы, например, ((1 + 2)/2) + ((2 + 3)/2) + ... с использованием reduce и lambdas

reduce(lambda x, y: (x + y)/2, list_of_nums) 
+4

Думаю, он хочет суммировать смежные элементы. Не было бы смысла брать среднее значение `x` и` x - 1`; мы могли бы просто вычесть 0.5 вместо этого. – 2010-12-06 02:08:10

+2

Функция уменьшения не делает то, что говорит сообщение. Он вычисляет (((a1 + a2)/2 + a3)/2 + a4)/2 ... – Moberg 2015-02-18 14:41:02

158

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

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

Редактировать: Я предполагаю, что вы хотите видеть десятичные числа в результате, хотя ваши входные значения являются целыми числами. По умолчанию Python выполняет целочисленное деление: он отбрасывает оставшуюся часть. Чтобы разделить все на всем пути, нам нужно использовать числа с плавающей запятой. К счастью, деление int на float будет производить 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) работает просто отлично.

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

+0

Я не получил, поскольку для первого вопроса у меня был не указан my_list. В моей программе его случайное число не 1, 2, 3, 4 .. для второго вопроса i't не работает со мной, я не знаю, почему – layo 2010-12-06 02:17:18

+30

`my_list` определяется только в том случае, если вы его определяете. Это должно было стать владельцем места для того, что вы назвали списком, с которым вы пытаетесь работать. Я не могу догадаться, как вы это назвали. – 2010-12-06 02:20:18

+1

6 лет спустя этот пост все еще помогает людям. У меня был сбой в моем коде и я смог использовать ваш пост, чтобы подтвердить, что связанные с ним концепции в моем коде для вас тоже были правильными, поэтому проблема должна лежать в другом месте. Потом я нашел его. Просто дал вам и человеку вопрос с голосом, как быстро поблагодарить вас. С наилучшими пожеланиями. – TMWP 2017-03-17 18:05:41

0

Попробуйте использовать список.Что-то вроде:

new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))] 
+0

То есть * нет * очень хороший список понимание. – 2010-12-06 02:15:56

2

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

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] 
0

В духе itertools. Вдохновение от парного рецепта.

from itertools import tee, izip 

def average(iterable): 
    "s -> (s0,s1)/2.0, (s1,s2)/2.0, ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return ((x+y)/2.0 for x, y in izip(a, b)) 

Примеры:

>>>list(average([1,2,3,4,5])) 
[1.5, 2.5, 3.5, 4.5] 
>>>list(average([1,20,31,45,56,0,0])) 
[10.5, 25.5, 38.0, 50.5, 28.0, 0.0] 
>>>list(average(average([1,2,3,4,5]))) 
[2.0, 3.0, 4.0] 
1

Использование pairwiseitertools recipe:

import itertools 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = itertools.tee(iterable) 
    next(b, None) 
    return itertools.izip(a, b) 

def pair_averages(seq): 
    return ((a+b)/2 for a, b in pairwise(seq)) 
1

Короткий и простой:

def ave(x,y): 
    return (x + y)/2.0 

map(ave, a[:-1], a[1:]) 

А вот как это выглядит:

>>> a = range(10) 
>>> map(ave, a[:-1], a[1:]) 
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5] 

Из-за какой-то глупости, в том, как Python обрабатывает map более двух списков, вы должны отсечь список, a[:-1]. Он работает больше, как можно было ожидать, если вы используете itertools.imap:

>>> import itertools 
>>> itertools.imap(ave, a, a[1:]) 
<itertools.imap object at 0x1005c3990> 
>>> list(_) 
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5] 
-1

Я просто использовать лямбда с картой()

a = [1,2,3,4,5,6,7,8,9,10] 
b = map(lambda x, y: (x+y)/2.0, fib[:-1], fib[1:]) 
print b 
20
>>> 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 

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

0
n=int(input("enter the length of array :")) 
list1=[] 
for i in range(n): 
    list1.append(int(input("enter numbers :"))) 
print("user inputs are",list1) 

list2=[] 
for j in range(0,n-1): 
    list2.append((list1[j]+list1[j+1])/2) 
print("result =",list2) 
3

Все ответы показали программный и общий подход. Я предлагаю математический подход, специфичный для вашего дела. Это может быть быстрее, особенно для длинных списков. Это работает, потому что ваш список приведен список натуральных чисел до 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]), поэтому вы избегаете повторения элемента s:

>>> 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 
9

Используя простой list-comprehension и sum:

>> sum(i/2. for i in range(x)) #if x = 10 the result will be 22.5 
5

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

l =[1,2,3,4,5] 
sum=0 
for element in l: 
    sum+=element 
print sum 
0
mylist=[1,2,3,4] 
total=0 
def add(mylist): 
    for i in mylist: 
     total+=i 
    return total 

result=add(mylist) 
print("sum = ",result) 
48

Вопрос 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) 
1

я использую в то время как цикл, чтобы получить результат

i=0 
while i <len(a)-1: 
    result=(a[i]+a[i+1])/2 
    print result 
    i +=1 
0

перекручивание через элементы в списке и обновление общей, как этот

def sum(a): 
    total = 0 
    index = 0 
    while index < len(a): 
     total = total + a[index] 
     index = index + 1 
    return total 
6

Вы можете попробовать этот путь.

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 
1
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] 
Смежные вопросы