介紹:
所以我知道已經有一個問題(在回圈中跳過多次迭代)類似于我的一個非常好的答案,但仍然有一些懸而未決的問題對我來說:
問題 1:
有沒有沒有迭代器的方法?
我正在尋找類似* 3 的東西:song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
for sing in song:
print(sing, end=" ")
if sing == 'look':
continue * 3
預期輸出:
always look side of life
問題2:
如果我必須使用迭代器物件,那么是否可以在固定的時間內使用它?
原來的問題有這樣的解決方案:
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
print(sing)
if sing == 'look':
next(song_iter)
next(song_iter)
next(song_iter)
print(next(song_iter))
但我希望它這樣做,假設x = 5次。這是不可能的:
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
print(sing)
if sing == 'look':
next(song_iter) * x
print(next(song_iter))
那么你會怎么做呢?我知道可以使用該函式,但是有沒有沒有任何庫的方法?itertools.islice
我的方法:
這很好用:song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
skip_iterations = 3
for sing in song_iter:
print(sing)
if sing == "look":
while skip_iterations > 0:
next(song_iter, "")
skip_iterations -= 1
輸出:
always look side of life
但也許其他人有更好的主意?:)
鏈接:
The Question I was mentioning - The Answer for that question
uj5u.com熱心網友回復:
Ans 1 有很多方法可以解決這個問題,最簡單的方法之一就是檢查索引,例如
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
skip_iterations=3
for i,sing in enumerate(song):
if not song.index('look') < i < song.index('look') skip_iterations 1:
print(sing, end=" ")
'enumerate' 回傳 (index, element) Ans 2 您的方法很好,您可能更喜歡 for 回圈而不是 while 回圈,但這只是個人建議。
uj5u.com熱心網友回復:
另一種方法是使用for具有更完整更新邏輯的 C 樣式回圈:
def cfor(i, test_i, update_i):
while test_i(i):
yield i
i=update_i(i)
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
skip=3
for i in cfor(0,
lambda i: i<len(song),
lambda i: i skip 1 if song[i]=='look' else i 1):
print(song[i], end=' ')
或者,這可以只是一個while回圈:
idx=0
while(idx<len(song)):
print(song[idx], end=' ')
idx =skip 1 if song[idx]=='look' else 1
如果你skip很大,這兩者中的任何一個都會更快。
您還可以使用enumerate理解:
l=song.index('look')
' '.join([w for i,w in enumerate(song) if i<=l or i>(l skip)])
uj5u.com熱心網友回復:
使用跳過計數器:
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
skip = 0
for sing in song:
if skip:
skip -= 1
continue
print(sing, end=" ")
if sing == 'look':
skip = 3
uj5u.com熱心網友回復:
問題 1
您可以使用迭代系結來跟蹤何時可以在回圈中恢復評估
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
iter_bound = -1
for i, sing in enumerate(song):
if i <= iter_bound:
continue
if sing == 'look':
iter_bound = i 3
print(sing, end=" ")
如果您在代碼中經常使用它,您可能希望圍繞它撰寫一個函式:
from typing import Iterable, Callable
def skip_n_on_condition(iterator: Iterable, condition: Callable, n_skips: int):
"""Loop over iterable and perform n_skips whenever the condition on the element is met"""
iter_bound = -1
for i, element in enumerate(iterator):
if i <= iter_bound:
continue
if condition(element):
iter_bound = i 3
yield element
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
print(*skip_n_on_condition(song, lambda x: x == 'look', 3), end=" ")
問題2
由于您知道回圈的次數,因此最好使用for回圈。它也將是一個不會改變您可能沒有預料到的 skip_iterations 值的實作。
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
skip_iterations = 3
for sing in song_iter:
print(sing)
if sing == "look":
for _ in range(skip_iterations):
next(song_iter, "")
您可以使用串列理解使回圈成為單行。
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
skip_iterations = 3
for sing in song_iter:
print(sing)
if sing == "look":
[next(song_iter, "") for _ in range(skip_iterations)]
uj5u.com熱心網友回復:
我會考慮迭代的“歷史性”方式。
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
i = 0
while i < len(song):
sing = song[i]
i = 1
print(sing, end=" ")
if sing == 'look':
i = 3
continue
# ... other code ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386807.html
標籤:python loops for-loop iterator continue
下一篇:如何創建本地存盤
