web-dev-qa-db-ja.com

ループのリスト内包表記Python

私は多くのN次元配列を使用しますが、そのようなインデントされたコードを書く必要があり、いくつかのコードをリスト内包表記とインラインステートメントに置き換えることができるのは苦痛です。例えば:

for x in (0,1,2,3):
    for y in (0,1,2,3):
        if x < y:
            print (x, y, x*y)

次のものに置き換えることができます。

print [(x, y, x * y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

しかし、印刷の代わりにアクションを変更して、次のような何かを行うにはどうすればよいですか?

total = x+y

だから私がしたいことは次のようなものです:

[(total+=x+y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

しかし、これは機能しません

これを行うためのスマートな方法はありますか?

for x in (0,1,2,3):
        for y in (0,1,2,3):
            if x < y:
                total+=x+y
26
disruptive

sumはここで機能します:

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
32
Jochen Ritzel

Nレベルの深さのループを記述する代わりに、 itertools.product() を使用できます。

In [1]: import itertools as it

In [2]: for x, y in it.product((0,1,2,3),(0,1,2,3)):
   ...:     if x < y:
   ...:         print x, y, x*y

0 1 0
0 2 0
0 3 0
1 2 2
1 3 3
2 3 6

これは自然にN次元に拡張されます。

12
NPE

numpy を使用します。これにより、ベクトルのように加算される配列を使用できます。

x = numpy.arange(3)
y = numpy.arange(3)
total = x + y

変更された質問で、sumへの呼び出しも追加します

total = numpy.sum(x+y)
5

削減機能は、集合アイテムを単一のアイテムに直接削減します。 それらについての詳細はこちら が可能ですが、これはあなたのために働くはずです:

total=reduce(lambda x,y:x+y,range(4))

または

total=reduce(lambda x,y:x+y,(0,1,2,3))
2
WebServer

別の可能性は次のとおりです。

for x,y in ((x,y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y):
  print (x, y, x * y)

このようにして、理解リストを実際に作成せずに、リスト理解で使用するものを繰り返し処理できます(私の意味がわかれば;)それは非常に便利です。

2
drevicko