

２次元配列liがあり

[code]

    li =[[1,2],
         [2,3],
         [3,4],
         [4,5],
         [1,3],
         [1,4]]
    
[/code]

１つ目の要素が１である箇所の２つ目の要素の合計を計算したいです．  
上のリストの場合，１つ目の要素が１である[1,2][1,3][1,4]の  
２つ目の要素の合計を算出(2+3+4=9)といった具合です．

filter,map,sum,lambdaをうまく使えば，できると思うのですが・・・

分かりにくい文章で申し訳ありませんが，よろしくお願いいたします．


CC BY-SA 3.0
2017-11-26T23:34:35.080
39869
2017-11-27T03:47:40.507
2017-11-27T02:18:20.783
19110
26341
question
python python3
pythonで２次元配列の１つ目の要素から，２つ目の合計を算出


numpy.whereを使ってみてはどうでしょう。

[code]

    import numpy as np
    
    li =[[1,2],
         [2,3],
         [3,4],
         [4,5],
         [1,3],
         [1,4]]
    
    m = np.array(li)
    idx = np.where(m[:,0]==1)
    np.sum(m[idx, 1])
    
[/code]

以下、追記。  
お遊びレベルの修正ですが、pandasのDataFrameを使えば、次のようにまとめられます。

[code]

    import pandas as pd
    df = pd.DataFrame(li)
    a = df.where(df[0]==1).sum()[1]
    
[/code]

あと、ご質問のコメントの中にある回答ですが、

[code]

    sum([e[1] for e in li if e[0] == 1])
    
[/code]

は、内包表記の[]は省略できます。

[code]

    sum(e[1] for e in li if e[0] == 1)
    
[/code]

こちらは、中間のリストを作成しない分メモリ効率がよくなる場合があるようです（差が出るようなサイズで試したことがないので伝聞調です）。詳細な仕組みまでは説明しませんが、Pythonのジェネレータ式としてsumの中が機能しています。


CC BY-SA 3.0
2017-11-27T00:56:10.743
39871
2017-11-27T03:47:40.507
2017-11-27T03:47:40.507
26311
26311
39869
answer


filter, mapを使っても可能ですが、あまりPythonicではありません。

[code]

    filtered = filter(lambda e: e[0] == 1, li)
    mapped = map(lambda e: e[1], filtered)
    print(sum(mapped))
    
[/code]

コメントで言われているように、(件数にもよりますが)内包表現を使ったほうが簡潔でオススメです。

[code]

    print(sum(e[1] for e in li if e[0] == 1))
    
[/code]


CC BY-SA 3.0
2017-11-27T01:37:59.280
39872
2017-11-27T01:37:59.280
26172
39869
answer