0

以下の Rhino v.5 の Python リスト内包表記コードを検討してください。

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 ではなくリスト内包表記にあるため、残りの構文を読んでいただければ幸いです。

私がうまくいかないのは、次のリストスライスコード内の2番目の「j」です。

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

j=1 の場合のみ結果が得られますが、j=2 の場合は得られませんが、range(1,3) のループで aj を使用しています。

この場合、「for j in range(1,3)」はまったく機能していません。「objlist + str(j)」に使用している「=」の左側でのみ機能していますか?または、リスト内包表記ではまったく使用しないでください。リスト内包表記ですべてを書き直す方法を見つける必要がありますか?

ps 辞書で globals() の問題を解決したとしても、反復ごとに異なる範囲でリストをスライスするために j が必要です。

4

1 に答える 1

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ループの書き方により、 equal toのケースは variable にのみ適用され、 equal toのケースは1variable にのみ適用されることに注意してください。それがあなたを混乱させているのですか?objlist1j2objlist2

これもリファクタリングする必要があると思います。内包表記が非常に長い行になる場合は、リスト内包表記を常に賢くしようとするよりも、明示的なループを使用する方がよいでしょう。そして、はい、ここで辞書をいじるのではなく使用する必要がありますが、globals()すでにそれを知っていると思います.

于 2013-02-15T00:17:08.757 に答える