Подведите список чисел в 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
получить один номер?
Это не работает для меня.
Ответы
Ответ 1
Вопрос 1: Итак, вы хотите (элемент 0 + элемент 1)/2, (элемент 1 + элемент 2)/2,... и т.д.
Мы составляем два списка: один для каждого элемента, кроме первого, и один для каждого элемента, кроме последнего. Тогда средние значения, которые мы хотим, являются средними значениями каждой пары, взятыми из двух списков. Мы используем zip
чтобы взять пары из двух списков.
Я предполагаю, что вы хотите видеть десятичные дроби в результате, даже если ваши входные значения являются целыми числами. По умолчанию Python выполняет целочисленное деление: он отбрасывает остаток. Чтобы разделить вещи на всем пути, нам нужно использовать числа с плавающей точкой. К счастью, деление целого числа на число с плавающей точкой приведет к созданию числа с плавающей точкой, поэтому мы просто используем 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)
работает просто отлично.
Вам нужно будет более точно указать, что именно вы написали и как это не работает.
Ответ 2
Список номеров:
sum(list_of_nums)
Вычисление половины n и n - 1 (если у меня есть правильный шаблон), используя понимание списка:
[(x + (x - 1)) / 2 for x in list_of_nums]
Суммировать смежные элементы, например. ((1 + 2)/2) + ((2 + 3)/2) +... используя уменьшить и lambdas
reduce(lambda x, y: (x + y) / 2, list_of_nums)
Ответ 3
Вопрос 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)
Ответ 4
Вы можете попробовать так:
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
Ответ 5
>>> 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
была определена где-то в коде и перезаписывает функцию по умолчанию. Поэтому я удалил его, и проблема была решена.
Ответ 6
Используя простое list-comprehension
и sum
:
>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
Ответ 7
Все ответы показали программный и общий подход. Я предлагаю математический подход, специфичный для вашего случая. Это может быть быстрее, в частности, для длинных списков. Это работает, потому что ваш список представляет собой список натуральных чисел до 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
Ответ 8
Самый простой способ решить эту проблему:
l =[1,2,3,4,5]
sum=0
for element in l:
sum+=element
print sum
Ответ 9
Генераторы - это простой способ написать это:
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]
Ответ 10
Короче и просто:
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]
Ответ 11
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]
Ответ 12
Используя pairwise
рецепт itertools:
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) )
Ответ 13
Я бы просто использовал лямбда с картой()
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
Ответ 14
Я использую while
цикл, чтобы получить результат:
i = 0
while i < len(a)-1:
result = (a[i]+a[i+1])/2
print result
i +=1
Ответ 15
Переберите элементы в списке и обновите итог следующим образом:
def sum(a):
total = 0
index = 0
while index < len(a):
total = total + a[index]
index = index + 1
return total
Ответ 16
Благодаря Карлу Ннехтелю я смог понять ваш вопрос. Моя интерпретация:
- Вы хотите новый список со средним значением элементов я и я + 1.
- Вы хотите суммировать каждый элемент в списке.
Первый вопрос с использованием анонимной функции (иначе лямбда-функция):
s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else [] #assuming you want result as float
s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) if len(l)>1 else [] #assuming you want floor result
Второй вопрос также с использованием анонимной функции (иначе лямбда-функция):
p = lambda l: l[0] + p(l[1:]) if l!=[] else 0
Оба вопроса объединены в одну строку кода:
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0 #assuming you want result as float
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0 #assuming you want floor result
используйте тот, который лучше всего соответствует вашим потребностям
Ответ 17
Давайте сделаем это легко для начинающих: -
- Ключевое слово
global
позволит назначать сообщение глобальной переменной в основной функции без создания новой локальной переменной.
message = "This is a global!"
def main():
global message
message = "This is a local"
print(message)
main()
# outputs "This is a local" - From the Function call
print(message)
# outputs "This is a local" - From the Outer scope
Эта концепция называется Shadowing
- Подведите список чисел в Python
nums = [1, 2, 3, 4, 5]
var = 0
def sums():
for num in nums:
global var
var = var + num
print(var)
if __name__ == '__main__':
sums()
Выходы = 15
Ответ 18
Попробуйте использовать понимание списка. Что-то вроде:
new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]
Ответ 19
В духе 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]
Ответ 20
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)
Ответ 21
Простой способ - использовать перестановку iter_tools
# If you are given a list
numList = [1,2,3,4,5,6,7]
# and you are asked to find the number of three sums that add to a particular number
target = 10
# How you could come up with the answer?
from itertools import permutations
good_permutations = []
for p in permutations(numList, 3):
if sum(p) == target:
good_permutations.append(p)
print(good_permutations)
Результат:
[(1, 2, 7), (1, 3, 6), (1, 4, 5), (1, 5, 4), (1, 6, 3), (1, 7, 2), (2, 1, 7), (2, 3,
5), (2, 5, 3), (2, 7, 1), (3, 1, 6), (3, 2, 5), (3, 5, 2), (3, 6, 1), (4, 1, 5), (4,
5, 1), (5, 1, 4), (5, 2, 3), (5, 3, 2), (5, 4, 1), (6, 1, 3), (6, 3, 1), (7, 1, 2),
(7, 2, 1)]
Обратите внимание, что порядок имеет значение - значение 1, 2, 7 также отображается как 2, 1, 7 и 7, 1, 2. Вы можете уменьшить это, используя набор.
Ответ 22
Попробуйте следующее -
mylist = [1, 2, 3, 4]
def add(mylist):
total = 0
for i in mylist:
total += i
return total
result = add(mylist)
print("sum = ", result)