簡體   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