Pythonで数値のリストを合計する

1,2,3,4,5...]といった数字のリストがあり、(1+2)/2、2番目は(2+3)/2と3番目は計算したいのです、 (3+4)/2、といった具合に。どうすればいいのでしょうか?

1番目の数字と2番目の数字を合計して2で割り、2番目の数字と3番目の数字を合計して2で割る、というようなことをしたいです。

また、数字の羅列を合計するにはどうしたらいいのでしょうか?

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

そうなんですか:

b = sum(a)
print b

を1つの数字にするのか?

これは私には使えません&#8252。

質問へのコメント (3)

質問1:(要素0+要素1)/2、(要素1+要素2)/2、...などとしたいわけですね。

最初の要素を除くすべての要素からなるリストと、最後の要素を除くすべての要素からなるリストの2つを作る。そして、欲しい平均値は、2つのリストから取り出した各ペアの平均値である。2つのリストからペアを取り出すには、zipを使用する。

入力値が整数であるにもかかわらず、結果に小数を表示させたいのだと思います。Pythonのデフォルトでは、整数の除算を行います:余りを捨ててしまうのです。ずっと割り切るには、浮動小数点数を使う必要があります。幸い、intをfloatで割るとfloatになるので、除数には2の代わりに2.0を使うだけです。

このように

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)` で十分です。

何を書いたのか、どううまくいっていないのか、より具体的に説明する必要があります。

解説 (4)

数字の羅列を和訳する:

sum(list_of_nums)

リスト理解]1を使って、nとn - 1の半分を計算する(パターンが正しければ):

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

reduce]2lambdas を使って、((1 + 2) / 2) + ((2 + 3) / 2) + ...など、隣接する要素を合計します。

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)
解説 (2)

この方法で試すことができます。

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)
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45

sumはコードのどこかで定義されており、デフォルトの関数を上書きしているようです。 削除して問題が解決しました。

解説 (0)

単純な「リスト理解」と「合計」を使用する:

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

すべての回答は、プログラム的かつ一般的なアプローチを示していました。 私はあなたのケースに固有の数学的アプローチを提案します。 特に長いリストの場合、より高速になる可能性があります。 リストが nまでの自然数のリストであるため、機能します。

自然数 1、2、3を持っていると仮定します。 ...、10:

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

リストで「合計」関数を使用できます。

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

ここでも、そのリストの「合計」関数を使用できます。

>>> 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
解説 (0)

この問題を解決する最も簡単な方法:

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum
解説 (0)

初心者のために簡単にしましょう:-。

1。 globalキーワードを使用すると、新しいローカル変数を生成せずに、グローバル変数メッセージをメイン関数内に割り当てることができます。

メッセージ=「これはグローバルです。!"。 。 。 def main(): グローバルメッセージ。 メッセージ=「これはローカルです」。 print(メッセージ)。 。 。 main()。

出力「これはローカルです」-関数呼び出しから。

print(メッセージ)。

出力「これはローカルです」-外側のスコープから。

この概念はシャドウイングと呼ばれます。

2。 Pythonで数値のリストを合計します。

nums = [1、2、3、4、5]。 。 var = 0。 。 。 def sums(): 数字のnumの場合: グローバルvar。 var = var + num。 print(var)。 。 。 name == 'main'の場合: 合計()。

出力= 15

解説 (0)

短くて簡単:

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が2つのリストで「マップ」を処理する方法にはある程度の愚かさがあるため、リスト「a [:-1]」を切り捨てる必要があります。 itertools.imap:を使用すると、期待どおりに機能します。

>>> import itertools
>>> itertools.imap(ave, a, a[1:])

>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
解説 (2)

pairwise itertools recipesの使用:

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) )
解説 (0)

発電機はこれを書くの簡単な方法です:

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]
解説 (2)
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]
解説 (0)

「while」ループを使用して結果を取得します。

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
解説 (0)
  • Karl Knechtel *のおかげで、あなたの質問を理解することができました。 私の解釈:

1。 要素iとi + 1の平均を持つ新しいリストが必要です。 2。 リストの各要素の合計を希望します。

匿名関数を使用した最初の質問(別名. ラムダ関数): 。 s =ラムダl:[(l [0] + l [1])/ 2。] + s(l [1:])len(l)> 1の場合、[]#結果をフロートとして希望する場合。 s =ラムダl:[(l [0] + l [1])// 2] + s(l [1:])len(l)> 1の場合[]#床の結果が必要な場合。

2番目の質問も匿名関数(別名. ラムダ関数): 。 p =ラムダl:l [0] + p(l [1:])lの場合。!= []その他0。

両方の質問を1行のコードで組み合わせる: 。 s =ラムダl:(l [0] + l [1])/ 2。 + s(l [1:])len(l)> 1の場合、0#結果をfloatとして希望する場合。 s =ラムダl:(l [0] + l [1])/ 2。 + s(l [1:])len(l)> 1の場合、0#フロア結果が必要な場合。 ニーズに最適なものを使用してください

解説 (0)

map()でラムダを使用します。

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)

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]
解説 (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)
解説 (0)

リスト理解力を使ってみてください。みたいな感じで:

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