5

これを行うより賢明な方法はありますか?他の多くのリストのインデックスを合計して、新しいリストを作成したいと考えています。私はプログラミングにかなり慣れていないので、これは非常に不格好な方法のようです!

list1 = [1,2,3,4,5]
list2 = [1,1,1,4,1]
list3 = [1,22,3,1,5]
list4 = [1,2,5,4,5]
...
list100 = [4,5,6,7,8]

i = 0
while i < len(list1):
    mynewlist[i] = list1[i]+list2[i]+list3[i]+list4[i]+...list100[i]
    i = i+1
4

4 に答える 4

17

これは、のかなり良いユースケースですzip

>>> list1 = [1,2,3,4,5]
>>> list2 = [1,1,1,4,1]
>>> list3 = [1,22,3,1,5]
>>> list4 = [1,2,5,4,5]
>>> [sum(x) for x in zip(list1, list2, list3, list4)]
[4, 27, 12, 13, 16]

または、個別のリストではなくリストのリストとしてデータがある場合:

>>> data = [[1,2,3,4,5], [1,1,1,4,1], [1,22,3,1,5], [1,2,5,4,5]]
>>> [sum(x) for x in zip(*data)]
[4, 27, 12, 13, 16]

同様に、データdictをリストのとして保存する場合は、dict.itervalues()またはdict.values()を使用してリスト値を取得し、同様の方法で使用できます。

>>> data = {"a":[1,2,3], "b":[3,4,4]}
>>> [sum(x) for x in zip(*data.itervalues())]
[4, 6, 7]

リストの長さが等しくない場合は、リストのzip長さが最短になるまで機能することに注意してください。例えば:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]]
>>> [sum(x) for x in zip(*data)]
[4, 27]

すべてのデータを含む結果を取得したい場合は、itertools.izip_longest(適切なを使用してfillvalue)を使用できます。例:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]]
>>> [sum(x) for x in izip_longest(*data, fillvalue=0)]
[4, 27, 8, 4, 5]
于 2012-05-23T15:58:58.623 に答える
6

@Shawnの答えは正しいですが、これはmapリスト内包よりもエレガントかもしれないと私が思う場合です。

>>> list1 = [1,2,3,4,5]
>>> list2 = [1,1,1,4,1]
>>> list3 = [1,22,3,1,5]
>>> list4 = [1,2,5,4,5]
>>> map(sum, zip(list1, list2, list3, list4))
[4, 27, 12, 13, 16]
于 2012-05-23T16:03:45.007 に答える
1

そもそも問題はこれです:コードに100個の変数を含めるべきではありません。

list1 = [1,2,3,4,5]
list2 = [1,1,1,4,1]
list3 = [1,22,3,1,5]
list4 = [1,2,5,4,5]
...
list100 = [4,5,6,7,8]

代わりに、次のようなものが必要です

list_of_lists = []
list_of_lists.append([1,2,3,4,5])
list_of_lists.append([1,1,1,4,1])
list_of_lists.append([1,22,3,1,5])
list_of_lists.append([1,2,5,4,5])
...

次に、次のように目的の結果を計算します。

[sum(x) for x in zip(*list_of_lists)]
于 2012-05-23T16:11:47.290 に答える
0

あなたは本当にpythonチュートリアルを読む必要があります。

  1. sum(list1)そのリストの合計が表示されます。
  2. forループについて学ぶ必要があります
  3. リスト自体をリストに保存する必要があります
  4. リストのコレクションをローテーションする方法は、次を使用することzipです。

    list1 = [1,2,3,4,5]
    list2 = [1,1,1,4,1]
    list3 = [1,22,3,1,5]
    zip(list1,list2,list3)
    # matches up element n of each list with element n of the other lists
    #=> [(1, 1, 1), (2, 1, 22), (3, 1, 3), (4, 4, 1), (5, 1, 5)]
    # now you want to add up each of those tuples:
    [sum(t) for t in zip(list1,list2,list3)]
    #=> [3, 25, 7, 9, 11]
    

このようなリストのリストをzipで操作するには、itertoolsモジュールを参照するか、*args構文について学んでください。

于 2012-05-23T16:09:04.833 に答える