2013-02-15 61 views
0

考虑犀牛5节下面这条巨蟒列表解析代码:是python列表可以理解的内部for循环吗?

for j in range(1,3): 
    globals()["objlist" + str(j)] = [rs.OrientObject(obj, [rs.PointCoordinates(x) for x in objlist[1:4]], [rs.PointCoordinates(x) for x in objlist[1+ j*3:4+ j*3]], 1) for obj in objlist] 

为很多你不知道我打电话这里rhinoscriptsyntax命令:

rs.OrientObject and rs.PointCoordinates 

我希望你能阅读其余语法,因为问题出现在列表理解中,而不是在rhinoscriptsyntax中。

什么,我没有去工作,是第二个“J”的列表分片里面的代码:

objlist[1+ j*3:4+ j*3] 

我只得到这样的结果对于j = 1而不是J = 2虽然我使用循环范围内的aj(1,3)

是'对于范围(1,3)''在这种情况下根本不工作,它是否只适用于左侧'='我在'objlist + str(j)'中使用它,或者它不应该用于列表理解,我应该找到一种用列表理解重写所有内容的方法?

p.s.即使我用字典解决了globals()问题,我仍然需要j以便在每次迭代时在不同范围上分割列表。

+2

这段代码对我来说很合适。您的问题不在列表解析中。您可以尝试本地化问题,并提供我们可以实际测试的代码,而不是依赖您的话。 – wRAR 2013-02-15 00:10:16

+0

如果您有与列表理解问题,拉出来的较大的表达,并分别测试他们每个人,找出哪一个是不工作,然后弄清楚如何给我们一个[SSCCE(HTTP:// sscce.org)显示相同的问题,所以我们可以帮助您解决它。 – abarnert 2013-02-15 00:40:26

回答

3

嗯,这部分工作正常:

>>> objlist = range(10) 
>>> for j in range(1,3): 
... print objlist[1+ j*3:4+ j*3] 
... 
[4, 5, 6] 
[7, 8, 9] 

需要注意的是,由于这样你写的循环,用j等于1的情况下将仅适用于您的变量objlist1,和与j等于2的情况将仅适用于您的变量objlist2。这是什么让你感到困惑?

我认为你应该重构这个,最好是使用一个显式循环,而不是一直试图聪明地使用列表解析,如果理解将会变得如此之长。而且,是的,你应该在这里使用字典,而不是与globals()混淆,但我想你已经知道了。

+2

道具提及重构,而不是搞全球性 – Greg 2013-02-15 00:18:12

+0

试图解决字典问题之前先解决列表理解问题。一步一步来!我的想法是在列表理解风格中拥有一切。我仍然像你说的那样写循环,objlist1得到j = 1的情况,objlist2只有j = 2的情况。 我的新问题是:无论你在另一个列表理解中有多少个列表解析,'j'在这里总是是1或2?或者它是递归函数? – 2013-02-15 00:23:50

+0

是的,j在这里总是1或2,因为你只在最外层的j上循环。 – wim 2013-02-15 00:25:54