2011-10-21 126 views
23

我使用了很多N維數組,並且不得不編寫這樣的縮進代碼,我知道一些代碼可以用列表解析和內聯語句替換。例如:列表理解循環Python

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 
+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 

與修改後的問題,添加調用sum以及

total = numpy.sum(x+y) 
12

至於書法替代循環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維。

+0

itertools +1! –

2

Reduce函數直接降低了集體項目的單個項目。你可以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) 

通過這種方式,你可以遍歷任何你在使用一個列表理解而不實際創建理解列表(如果你明白了我的意思;)如果理解列表很大,也許這麼大以至於飽和,甚至不適合記憶,這很方便..