2011-10-21 127 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) 

通过这种方式,你可以遍历任何你在使用一个列表理解而不实际创建理解列表(如果你明白了我的意思;)如果理解列表很大,也许这么大以至于饱和,甚至不适合记忆,这很方便..