web-dev-qa-db-ja.com

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

私は[1,2,3,4,5...]のような数のリストを持っています、そして私は(1+2)/2を計算したいと思います、そして2番目の(2+3)/2と3番目の(3+4)/2、等々。どうやってやるの?

最初の数と2番目の数を合計して2で割った後、2番目の数と3番目の数を合計して2で割るというようにします。

また、どうやって数のリストを合計することができますか?

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

それは...ですか:

b = sum(a)
print b

一つの番号を取得する?

これは私にはうまくいきません。

316
layo

質問1:つまり、(要素0 +要素1)/ 2、(要素1 +要素2)/ 2、...などが必要です。

2つのリストを作成します。最初の要素を除くすべての要素の1つと、最後の要素を除くすべての要素の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)はうまく動きます。

あなたはあなたが書いたものとそれがどのように機能していないかについて正確にもっと具体的にならなければならないでしょう。

239
Karl Knechtel

数字の合計リスト:

sum(list_of_nums)

リスト内包表記 を使用して、nとn - 1の半分を計算します(パターンが正しい場合)。

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

隣接する要素を合計します。 ((1 + 2)/ 2)+((2 + 3)/ 2)+ ... reduce および lambdas を使用

reduce(lambda x, y: (x + y) / 2, list_of_nums)
97
Rafe Kettler

質問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)
63
Evans Murithi

あなたはこのように試すことができます:

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
26
>>> 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はどこかのコードで定義されており、デフォルトの関数を上書きしているようです。だから私はそれを削除して問題は解決した。

24
user4183543

単純なlist-comprehensionsumを使う:

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

すべての回答はプログラム的で一般的なアプローチを示していました。私はあなたのケースに特有の数学的アプローチを提案します。長いリストの場合は特に速くなります。あなたのリストは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
10
Ely

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

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum
5
shashankS

ジェネレータはこれを書くための簡単な方法です:

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
Jochen Ritzel
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
tagoma

短くて簡単:

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つのリストに渡って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]
2

おかげで Karl Knechtel 私はあなたの質問を理解することができた。私の解釈:

  1. あなたは要素iとi + 1の平均の新しいリストが欲しいです。
  2. リストの各要素を合計します。

無名関数(別名ラムダ関数)を使ったFirst question:

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

Second questionも無名関数(Lambda関数)を使っています。

p = lambda l: l[0] + p(l[1:]) if l!=[] else 0

1行のコードにまとめられたBothの質問:

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
Stickysli

リスト内の要素をループ処理して、合計を次のように更新します。

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

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
1
Orane

結果を得るためにwhileループを使います。

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

pairwiseitertoolsレシピを使う

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
tzot

初心者のためにそれを簡単にしましょう: -

  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 __== '__main__':
    sums()

出力= 15

1
Aamir M Meman

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
kevpie
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
vasanth kumar

リスト内包表記を使ってみてください。何かのようなもの:

new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]
0
TartanLlama
mylist=[1,2,3,4]   
total=0
def add(mylist):
    for i in mylist:
        total+=i
    return total

result=add(mylist)
print("sum = ",result)
0
Sai G

簡単な方法は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
Jesse