12

リスト内の2つのアイテムを一度に繰り返すより良い方法があるかどうか疑問に思っています。私はMayaをよく使用していますが、そのコマンドの1つ(listConnections)は交互の値のリストを返します。リストは[connectionDestination、connectionSource、connectionDestination、connectionSource]のようになります。このリストで何かをするために、私は理想的には次のようなことをしたいと思います:

for destination, source in cmds.listConnections():
    print source, destination

もちろん、[:: 2]を使用してリスト内の他のすべての項目を反復し、列挙してソースをインデックス+ 1にすることもできますが、奇数のリストなどのチェックを追加する必要があります。

私がこれまでに思いついた最も近いものは次のとおりです。

from itertools import izip
connections = cmds.listConnections()
for destination, source in izip(connections[::2], connections[1::2]):
    print source, destination

私はすでに自分のやりたいことをする方法を持っているので、これはそれほど重要ではありません。これは、それを行うためのより良い方法があるはずのことの1つのように思えます。

4

2 に答える 2

9

次のドキュメントから取得した、反復可能オブジェクトからアイテムをグループ化するには、次の方法を使用できますzip()

connections = cmds.listConnections()
for destination, source in zip(*[iter(connections)]*2):
    print source, destination

または、より読みやすいバージョンについては、itertoolsドキュメントのgrouperレシピを使用してください。

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
于 2012-07-05T18:33:24.450 に答える
1

すべて、素晴らしい質問と回答。Andrew Clarkの答え(itertoolsを使用するための小道具!)を補完する別のソリューションを提供したいと思います。彼の答えは、次のように各値を1回返します。

iterable = [0, 1, 2, 3, 4, 5, 6,...] n = 2 grouper(n, iterable, fillvalue=None) --> [(0, 1), (2, 3), (3, 4), (5, 6),...]

以下のコードでは、各値がn個のサブシーケンスで表示されます。このような:

def moving_window(n, iterable):
  start, stop = 0, n
  while stop <= len(iterable):
      yield iterable[start:stop]
      start += 1
      stop += 1

--> [(0, 1), (1, 2), (2, 3), (3, 4),...]

このタイプの「移動ウィンドウ」または「カーネル」の一般的なアプリケーションは、科学と金融の移動平均です。

また、yieldステートメントを使用すると、各サブシーケンスを必要に応じて作成し、メモリに保存しないようにすることにも注意してください。

于 2015-07-15T15:21:27.070 に答える