Подведите список чисел в 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 ]

2 голосов
/ 29 января 2011

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

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 голос
/ 11 апреля 2019

Давайте сделаем это проще для новичка: -

  1. Ключевое слово 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

Эта концепция называется Затенение

  1. Суммирование списка чисел в 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

1 голос
/ 31 марта 2019

Благодаря Карлу Кнехтелю я смог понять ваш вопрос. Моя интерпретация:

  1. Требуется новый список со средним значением элементов i и i + 1.
  2. Вы хотите суммировать каждый элемент в списке.

Первый вопрос с использованием анонимной функции (также известной как лямбда-функция):

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

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

1 голос
/ 09 июля 2017

Переберите элементы в списке и обновите итоговое значение следующим образом:

def sum(a):
    total = 0
    index = 0
    while index < len(a):
        total = total + a[index]
        index = index + 1
    return total
1 голос
/ 11 декабря 2016

Я использую цикл while, чтобы получить результат:

i = 0
while i < len(a)-1:
   result = (a[i]+a[i+1])/2
   print result
   i +=1
1 голос
/ 06 декабря 2010

Использование рецепта 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) )
1 голос
/ 21 января 2015

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

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
0 голосов
/ 17 января 2019

Простой способ - использовать перестановку 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. Вы можете уменьшить это, используя набор.

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

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

new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]
0 голосов
/ 05 июля 2016

Попробуйте следующее -

mylist = [1, 2, 3, 4]   

def add(mylist):
    total = 0
    for i in mylist:
        total += i
    return total

result = add(mylist)
print("sum = ", result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...