2016-08-26 17 views
1
prefer_indic = [[[0, 4, 6, 5, 45, 1], [2, 3, 5, 6, 7, 1]],[[0, 0.27, 6, 7, 32, 3], [0.01, 0.39, 0, 0, 0, 0]]] 

リストの各リストからすべての値をそれぞれ対応するものに加算する合計リストを作成したいとします。私が欲しい正確であると :forループを使用したリストの合計の検索方法

sum = [[0+0, 4+0.27, 6+6, 5+7, 45+32, 1+3], [2+0.1, 3+0.39, 5+0, 6+0, 7+0, 1+0]]

私はlists.Iの大きなリストのための同じアルゴリズムを使用できるように、forループでそれをしたいが、それをより読みやすくするために、簡単な例を作りました。私はPython 2.7を持っています。

+0

になります。それは、非常に大きな配列のforループより速くなければなりません – Andrew

答えて

3

結合値を追加するためにsum()を使用し、その後、2つの以上のリストから要素をペアリングするzip() functionを使用します。

summed = [[sum(zipped) for zipped in zip(*column)] for column in zip(*prefer_indic)] 

注意あなたが対合するようあなたの行列を転置zip(*prefer_indic)コールを、行ではなく、ネストされたリストの '列'。

リストが大きい場合は、iterative version of zipを使用すると効果的です。 future_builtins.zip() locationを使用して、あなたのコードが自動的にPythonの3との上位互換性である:

try: 
    from future_builtins import zip 
except ImportError: 
    # Python 3 

summed = [[sum(zipped) for zipped in zip(*column)] for column in zip(*prefer_indic)] 

デモ:私は二つのリストを追加する機能を定義し

>>> from future_builtins import zip 
>>> prefer_indic = [[[0, 4, 6, 5, 45, 1], [2, 3, 5, 6, 7, 1]],[[0, 0.27, 6, 7, 32, 3], [0.01, 0.39, 0, 0, 0, 0]]] 
>>> [[sum(zipped) for zipped in zip(*column)] for column in zip(*prefer_indic)] 
[[0, 4.27, 12, 12, 77, 4], [2.01, 3.39, 5, 6, 7, 1]] 
+0

完璧に感謝!!! –

+0

は次のように書くことができます:summed = [[zip(zip)in zip(* column)]のzip列(* prefer_indic)]を1行以上で書くことで、 。そして、実際には、それぞれの行が何をしているのか説明できますか? –

+0

@ThanosSmar:ネストされた 'for'ループを持つバージョンについては、http://pastebin.com/Yx1Uw9Gjを参照してください。 –

0

、その後、あなたの希望を計算するために、リストの内包表記を使用します結果:あなたのために

def add_lists(a, b): 
    return list(x+y for x, y in zip(a, b)) 

s = list(add_lists(*l) for l in zip(*prefer_indic)) 

prefer_indic = [[[0, 4, 6, 5, 45, 1], [2, 3, 5, 6, 7, 1]],[[0, 0.27, 6, 7, 32, 3], [0.01, 0.39, 0, 0, 0, 0]]] 

結果はあなたのリストには、私は、彼らがしている疑いがすべて同じ長さ、であれば、あなたは3D `numpy`配列を使用し、和深さ方向を計算することができ

[[0, 4.27, 12, 12, 77, 4], [2.01, 3.39, 5, 6, 7, 1]] 
関連する問題