2016-10-03 2 views
2

リストの最初の3つの要素を追加し、次に3つの要素を追加する必要があります。リストなど。リストを3つずつまとめたリストを作成する必要があります。つまり、最初の3つの要素を追加してから次の3つを追加します。

def get_triple_sums_list(a_list): 
    new_list = [] 
    for numbers in range(0,len(a_list)): 
     numbers = sum(a_list[:3]) 
     new_list.append(numbers) 
     return new_list 
    if a_list == []: 
     return [] 

リストの場合:これは私がこれまで持っているコードです

[1, 5, 3, 4, 5, 2] 

これは、今度は私の結果与える:私は

を取得する必要があります

[9] 

[9, 11] 

残りの数値が3、それはすなわち、

[1, 6, 2, 4, 3] 

は私に

[9, 7] 

そして

[1, 6, 2, 4] 

を与えてくれ合計の残りの部分を与えることは私に

[9, 4] 

答えて

3

を与えるのは、あなたのコードを分析してみましょう!ここで

def get_triple_sums_list(a_list): 
    new_list = [] 
    for numbers in range(0,len(a_list)): 
     numbers = sum(a_list[:3]) #You should be using the variable 
            #numbers here somehow. 
     #^^^^^^^ - You are overwriting the for-loop index. 
     new_list.append(numbers) 
     return new_list #Why are you returning here? You should be 
         #appending to `new_list`. 
    if a_list == []: 
     return [] 

固定コードです:

def get_triple_sums_list(a_list): 
    new_list = [] 
    for index in range(0,len(a_list), 3): #Range takes a 3rd param! 
     total = sum(a_list[index:index+3])#Get all the elements from the 
              #index to index+3 
     new_list.append(total) 
    return new_list 

UPDATE:それはそこに行くの短縮コンテストだようだ - と私は取り残されたくはありません。ここにリストに追加したい醜いバージョンがあります。

>>> a = [1,2,3,4,5,6,7,8] 
>>> a += [0]*(len(a)%3) #For people who are too lazy to import izip_longest 
>>> map(sum,zip(a[::3], a[1::3], a[2::3])) 
[6, 15, 15] 
2

その他の回答にはfault with your codeが記載されています。ただし、これらの場合には常にlist comprehensionを使用する方が簡単です。

>>> l = [1, 5, 3, 4, 5, 2] 
>>> [sum(l[i:i+3]) for i in range(0,len(l),3)] 
[9, 11] 

また、非MOD-3に示します

>>> l = [1, 5, 3, 4, 5] 
>>> [sum(l[i:i+3]) for i in range(0,len(l),3)] 
[9, 9] 

のために働くには、リスト内包の詳細についてはWhat does "list comprehension" mean? How does it work and how can I use it?を参照してください。

2

私は物事を説明するスーパーサイヤ人のアプローチが好きです。私はそれを少し短くする人になります。

l = [1, 5, 3, 4, 5, 2] 
n = 3  
r = [sum(l[i:i+n]) for i in range(0, len(l), n)] 

print(r) 
[9, 11] 

3のも、チャンクでリストを分割し、sumが一緒にこれらの追加の面倒をl[i:i+n]:あなたは、単一の理解と同じ結果を得ることができます。 for i in range(0, len(l), n)を使用すると、この操作はceil(len(l)/3)回発生するよう指示されます。

0

あるいは、あなたがlambda機能でmap()を使用して、それを達成することができる:ここでは

>>> my_list = [1, 5, 3, 4, 5, 2] 
>>> list(map(lambda x: sum(my_list[x:x+3]), range(0, len(my_list), 3))) 
[9, 11] 
+0

あなただけ言うことができる: '[合計(my_listという[I:+ 3])は、iの範囲のために(0、LEN(my_listという)、3)]' – SuperSaiyan

+0

はすでにここに答えました。しかし、そのソリューションを削除しました。たとえそれが動作していても正しい方法ではなかったからです。 –

+0

私の意見では、これは同じことを達成するためのより平凡な方法です。なぜあなたはそれが間違っていると思いますか分かりません。 (リストの理解はmap/lambdaの組み合わせよりももっとpythonic *です) – SuperSaiyan

0

itertools(python2でizip_longest)からzip_longestを使用してそれを行うの少し異なる方法で、それは3でリストを分割リストを作成して3つの要素のパックを取得し、最終的にパックを合計します。

from itertools import zip_longest 
a=[1, 6, 2, 4, 3] 
b=zip_longest(a[0::3],a[1::3],a[2::3],fillvalue=0) 
result=[sum(x) for x in b] 
>>>[9, 7] 
0

私は異なっていることを好みます。

l = [1, 5, 3, 4, 5, 3, 42] 
g = lambda l,s: [sum(l[i:i+s]) for i in range(0,len(l),s)] 
print g(l,3) 

#>> [9,12,42] 
+0

これは、他のものとほとんど同じ回答ですが、外側にラムダがラップされています。 – SuperSaiyan

+0

本当ですか?それは面白いです、それは同じ質問です... – kpie

+0

http://stackoverflow.com/questions/26939931/moving-non-overlapping-window-in-numpy http://stackoverflow.com/questions/25879735/how-to -implement-a-function-with-overlapping-and-rolling-features-simultaneo http://stackoverflow.com/questions/21097039/average-on-overlapping-windows-in-python – kpie

関連する問題