繁体   English   中英

将两个循环合二为一

[英]Combine two loop into one

我的代码中有三个不同的循环,但我想知道是否有办法将它们中的两个组合在一起只循环一次。 我的代码如下:

for x in groups:
    A bunch of code that produces the following...
    frames[x]
    highcs[x]

然后我循环通过下面的两个循环。 这些是我想要结合的。

for x, frame in frames.items():
    more unrelated code

for x, highc in highcs.items():

最后两个循环实际上只是使用xlsxwriter创建excel工作簿。 第一个循环创建工作簿并将帧[x]中的数据帧输入到工作表中。 然后highc返回相同的工作表并添加新的数据帧。

frameshighcs的长度相同,你可以使用zip()一次迭代它们:

for (f,frame), (h, highc) in zip(frames.items(), highcs.items()):
    # do your work here

zip()

此函数返回元组列表,其中第i个元组包含来自每个参数序列或可迭代的第i个元素。返回的列表的长度被截断为最短参数序列的长度。

使用itertools中的izip

from itertools import izip
for (x, frame), (x, highc) in izip(frames.items(), highcs.items()):
   ...

https://docs.python.org/2/library/itertools.html#itertools.izip

创建一个聚合来自每个迭代的元素的迭代器。 像zip()一样,除了它返回迭代器而不是列表。 用于一次迭代几次迭代的迭代步骤。

izip比zip更有效,因为izip返回迭代器而不是列表。 为了提高效率,请将.items()替换为.iteritems()

不确定你在做什么,但可能会再次遍历这些组?

for group in groups:
    frame = frames[group]
    highc = highcs[group]
    ...

Dunno这种方法是多么pythonic,但我可以想到两种快速而肮脏的方法。

他们是否保证使用相同的键进行键控? 如果是这样,您可以尝试:

for key in frames.keys():
    doSomething(frames[key])
    doSomethingElse(highcs[key])

或者,如果没有,它们是否具有相同的长度? 你可以:

for i in range(len(frames.keys())):
    frameKey = frames.keys[i]
    highcsKey = highcs.keys[i]
    doSomething(frames[frameKey])
    doSomethingElse(highcs[highcsKey])

即使它们的长度不同,您也可以(并且可能应该)测试两个字典的keys()列表的长度,并且只有在通过较短的字符串时才转换为较长的字典。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM