2016-08-09 29 views
4

各リストの合計をとり、個々の値を新しい単一リストに返す関数を作成しようとしています。 例えばSUM関数を使用しないネストされたリストの合計(演習)

[[2, 7, 6], [9, 5, 1], [4, 3, 8]] 

私がこれまで持って何

[15, 15, 15] 

次のようになります。

def row_sums(square): 
    total_list = [] 
    total = 0 
    for i in square: 
     for j in i: 
      total += j 
     total_list.append(total) 
    return total_list  

しかし、これは単なる結果としてお互いにそれぞれのリストを蓄積:

[15, 30, 45] 

各リストの合計をここで分けておく方法がわかりません。 SUM関数は、ネストされたループでの演習であるため、ここでは許可されていません。

ありがとうございました。

+2

セット '合計= 0 '内の最初の' for'ループを必要とするものです。また、インデントされたコードを正しく投稿するようにしてください。 – Julien

答えて

3

totalカウンターをリセットしてから各内部を起動する必要があります。 また、内部でのみ使用するため、外部に宣言する必要はありません。

def row_sums(square): 
    total_list = [] 
    for i in square: 
     total = 0 
     for j in i: 
      total += j 
     total_list.append(total) 
    return total_list 
+0

なぜ落札ですか? – levi

3

エラーは、各ループの後total変数を再初期化しないです。その代わり、そのようにするために、ループの最初の彼の内側sum = 0を初期化します。

def row_sums(square): 
    total_list = [] 
    for i in square: 
     total = 0 
     for j in i: 
      total += j 
     total_list.append(total) 
    return total_list 
+0

意味があります。少なくともそれは非常に単純なものでした。本当にありがとう。 –

+0

@RobertHemingwayあなたは大歓迎です。あなたが私の答えが好きだったら、それをupvoteしてください。 –

+0

なぜ私はdownvotedですか? –

1

あなたは、各リストのためのあなたの合計をゼロにする必要があります。ちょうど楽しみのため

def row_sums(square): 
    total_list = [] 
    total = 0 
    for i in square: 
     for j in i: 
      total += j 
     total_list.append(total) 
     total = 0 
    return total_list 
2

>>> list = [[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
>>> import functools 
>>> [functools.reduce(lambda x, y: x + y, sublist, 0) for sublist in list] 
[15, 15, 15] 

は、私はあなたがfunctools.reducehereについての詳細を読むことができますsum :)

を使用did't。

編集:Sevanteriはコメントで指摘したように、あなたも(!あなたが本当にあなたの先生が怒っドライブしたい場合)、異なるように

+2

そして、すでに整数のバイナリサム関数があるので、そのラムダを 'intで置き換えることができます。__add__'。 :) – Sevanteri

+0

@Sevanteri Hahaha私はこのアイデアが好きです! –

+1

'int .__ add__'を使うとちょっと醜いですが、私はむしろ' operator.add'を使用します:) – Copperfield

0

[functools.reduce(int.__add__, sublist, 0) for sublist in list] を使用するリストを平らにし、発電機を使用してすることができますが(サブリストがあると仮定し同じ長さ):

def _notsum2(lists): 
    per_yield = len(lists) 
    total = 0 
    for ind, next in enumerate(val for sublist in lists for val in sublist): 
     if ind % per_yield == 0 and ind: 
      yield total 
      total = 0 
     total += next 
    yield total 


if __name__ == '__main__': 
    li = [[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
    print [g for g in _notsum2(li)] 
-1

ます。また、それはようmapとリスト内包表記を使用して行うことができます。

l=[[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
a,b,c=[x for x in l] 
map(lambda x,y,z:x+y+z, a,b,c) 
-2

[sum(i) for i in zip(*[[2, 7, 6], [9, 5, 1], [4, 3, 8]])]

bultinのzip funcが、あなたが正確に

+1

OPは 'sum'なしでそれをやりたい、また各サブリスト内の要素の合計がすべてのサブリストとの組み合わせでないようにしたい – Copperfield

関連する問題