我想知道是否有更好的方法在列表中一次迭代两个项目。我经常使用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
这不是非常重要,因为我已经有办法做我想做的事。这似乎就是应该有更好的方法之一。
答案 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语句允许创建每个子序列,因为它需要而不是存储在内存中。