在列表中一次迭代两个项目的方法?

时间:2012-07-05 18:27:50

标签: python maya

我想知道是否有更好的方法在列表中一次迭代两个项目。我经常使用Maya,其中一个命令(listConnections)返回一个交替值列表。该列表将类似于[connectionDestination,connectionSource,connectionDestination,connectionSource]。要对此列表执行任何操作,我最好还是要做类似的事情:

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

你当然可以使用[:: 2]迭代列表中的每个其他项目,枚举和source将是索引+ 1,但是你必须为奇数列表和东西添加额外的检查。 / p>

到目前为止,我最接近的是:

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

这不是非常重要,因为我已经有办法做我想做的事。这似乎就是应该有更好的方法之一。

2 个答案:

答案 0 :(得分:6)

您可以使用以下方法对来自可迭代的项目进行分组,取自zip()的文档:

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

或者对于更易读的版本,请使用itertools文档中的grouper recipe

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)

答案 1 :(得分:0)

全部, 好问题&回答。我想提供另一个解决方案,应该赞扬Andrew Clark的答案(使用itertools的道具!)。他的答案会像这样返回每个值:

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),...]

此类移动窗口的常见应用程序&#39;或者&#39;内核&#39;是科学和金融的移动平均线。

另请注意,yield语句允许创建每个子序列,因为它需要而不是存储在内存中。