私は[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
一つの番号を取得する?
これは私にはうまくいきません。
質問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)
はうまく動きます。
あなたはあなたが書いたものとそれがどのように機能していないかについて正確にもっと具体的にならなければならないでしょう。
質問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)
あなたはこのように試すことができます:
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
>>> 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
はどこかのコードで定義されており、デフォルトの関数を上書きしているようです。だから私はそれを削除して問題は解決した。
単純なlist-comprehension
とsum
を使う:
>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
すべての回答はプログラム的で一般的なアプローチを示していました。私はあなたのケースに特有の数学的アプローチを提案します。長いリストの場合は特に速くなります。あなたのリストは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
この問題を解決するための最も簡単な方法:
l =[1,2,3,4,5]
sum=0
for element in l:
sum+=element
print sum
ジェネレータはこれを書くための簡単な方法です:
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]
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]
短くて簡単:
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]
おかげで Karl Knechtel 私はあなたの質問を理解することができた。私の解釈:
無名関数(別名ラムダ関数)を使った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
自分のニーズに最も合うものを使う
リスト内の要素をループ処理して、合計を次のように更新します。
def sum(a):
total = 0
index = 0
while index < len(a):
total = total + a[index]
index = index + 1
return total
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
結果を得るためにwhile
ループを使います。
i = 0
while i < len(a)-1:
result = (a[i]+a[i+1])/2
print result
i +=1
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) )
初心者のためにそれを簡単にしましょう: -
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
この概念は シャドウイング と呼ばれます
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
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]
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)
リスト内包表記を使ってみてください。何かのようなもの:
new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]
mylist=[1,2,3,4]
total=0
def add(mylist):
for i in mylist:
total+=i
return total
result=add(mylist)
print("sum = ",result)
簡単な方法は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としても表示されます。セットを使用して、これを減らすことができます。