2013-02-15 64 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