2011-10-21 18 views
23

Çok sayıda N boyutlu dizi kullanıyorum ve böyle girintili bir kod yazmak zorunda kaldığım için bir acı çekiyor ve bazı kodların liste anlaşmaları ve satır içi deyimlerle değiştirilebileceğini biliyorum. Örneğin:Döngüler için okuduğunu anlama Python

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

ile değiştirilebilir:

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

Ama nasıl böyle başka bir şey yapmak yerine baskı eylemini değiştirebilir:

total = x+y 

Yani ne istiyorum yapmak gibi bir şey:

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

nasıl daha iyi bir editör kullanırsınız, bu sizin için zorlama yapar, çünkü bu sizin asıl sorununuz gibi görünüyor. Benim görüşüme göre, örnek olarak gönderdiğiniz orijinal kod, okunması en kolay olanıdır. Itertools için –

cevap

30

sum burada çalışır:

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

Bu, çözümü çok daha iyi anlamak için en kolay yoldur. – oligofren

5

Kullanım numpy:Ancak bundan daha ziyade bunu yapmak için akıllı bir yol var mı

çalışmaz. Bu vektörler gibi eklemek diziler kullanmanızı sağlar: yazılı bir alternatif N düzeyleri derin döngüler gibi, sum yanı

total = numpy.sum(x+y) 
12

bir çağrı ekleyin modifiye soru ile

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

şunu kullanabilirsiniz 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 

Bu, doğal olarak N boyutlarına kadar uzar.

+0

+1! –

2

işlevi doğrudan tek öğeye toplu öğeleri azaltır azaltın. Sen read more about them here can, ancak bu sizin için çalışması gerekir:

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

veya

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

başka olasılık ise: Eğer kullanacağınız şey adımlayabilirsiniz Bu şekilde

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) 

Anlaşılan listeyi gerçekten oluşturmadan bir liste kavraması (eğer anlamımı alırsanız;) Eğer kavramış liste büyükse, belki de saturatları çok büyüktür ya da hafızaya sığmazsa, bu oldukça kullanışlı ..