2011-10-21 12 views
23

多くのN次元配列を使用すると、インデントされたコードを書き込む必要があり、リスト内包表記やインライン文で置き換えることができるコードがあることがわかりました。例えば:私がしたいどのようなのでループのリスト理解Python

total = x+y 

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] 

しかし、どのように私の代わりのような何かを行うには、印刷の動作を変更することができますdoは次のようなものです:

[(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 
+0

あなたの実際の問題であるように思われるので、あなたは良いエディタを使用してください。私の意見では、例として投稿したオリジナルのコードは、最も読みやすいコードです。 –

答えて

30

sum作品:

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

これは解決策をはるかに理解するのが最も簡単です。 – oligofren

5

使用numpy:しかし、これはではなく、これを行うためのスマートな方法があります

動作しません。修正質問で

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

、書き込みする代わりに、Nレベルが深いループのよう

同様 sum
total = numpy.sum(x+y) 
12

を呼び出しを追加、あなたが使用できます。これは、ベクトルのようにアップ追加の配列を使用することができます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次元に自然に拡張されます。ここ

+0

+1 itertools! –

2

機能を削減し、直接単一の項目に集団項目を削減します。あなたはread more about them hereをすることができますが、これはあなたのために働く必要があります。

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

または

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

別の可能性はある:あなたはあなたが使用したいものを反復処理することができます。このように

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) 

実際に理解していないリストを実際に作成することなしにリスト内包(私の意味を理解すれば);理解されたリストが大きければ、それが飽和したり、メモリに収まらない場合でも、それはかなり便利です。