将两个循环合并为一个

3

我在代码中有三个不同的循环,但我想知道是否有一种方法可以将其中两个循环合并为一个,只循环一次。我的代码如下:

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工作簿。第一个循环创建工作簿并将frames[x]中的数据框输入到工作表中。然后,highc会回到相同的工作表并添加新的数据框。

帧和高码率编码是否应该具有相同的长度? - Daniel Paczuski Bak
帧和高清流的长度相同吗? - Haifeng Zhang
是的,它们的长度相同。 - Milhouse
“...goes back over the same sheets and adds new dataframes” 是什么意思?它是指“追加数据框”吗? - styvane
抱歉,我的意思是将已创建的数据框添加到Excel表中。不会追加任何内容。 - Milhouse
4个回答

7

frameshighcs 的长度相同,您可以使用 zip() 同时迭代它们:

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

zip()

这个函数返回一个元组列表,其中第i个元组包含每个参数序列或可迭代对象的第i个元素。返回的列表长度将被截断到最短参数序列的长度。


如果 frameshighcs 的长度不相等,我们还能使用 zip() 吗? - pjk

2
使用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返回一个迭代器而不是列表。为了使它更加高效,可以用.iteritems()替换.items()。

0

不确定你在做什么,但也许可以再次迭代组?

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

0

不知道这种方法是否符合Python的风格,但我可以想到两种快速而简单的方法来实现它。

它们保证使用相同的键吗?如果是这样,你可以尝试:

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())列表的长度,只有当您通过较短列表的边界后,才会索引到较长列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接