将两个循环合二为一

时间:2016-04-20 16:06:15

标签: python python-3.x

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

VERSION BUILD=8940826 RECORDER=FX
TAB T=1
TAB CLOSEALLOTHERS
URL GOTO=http://www.w3schools.com/website/Customers_MYSQL.php
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=BODY ATTR=* EXTRACT=TXT
SET N EVAL("var json = JSON.parse('{{!EXTRACT}}'); json[0].Name;")
SET C EVAL("var json = JSON.parse('{{!EXTRACT}}'); json[json.length - 1].Country;")
PROMPT "First name: {{N}}\nLast country: {{C}}"

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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

zip()

  

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

答案 1 :(得分: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返回迭代器而不是列表。为了提高效率,请将.items()替换为.iteritems()

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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()列表的长度,并且只有在你通过了这个词典的界限后才能索引到更长的词典。较短的一个。