我itertools
使用下面的代碼為英文字母創建了一個回圈,
lowercase_letters_cycle = itertools.cycle(string.ascii_lowercase)
如果我for
在這個迭代器物件上運行一個回圈,第一次迭代會給我“a”作為輸出,因為回圈從“a”開始。我怎樣才能使回圈從我選擇的任何字母開始?
一種有效的方法是,
def start_cycle(letter):
lowercase_letters_cycle = itertools.cycle(lowercase_letters)
letter_index = lowercase_letters.index(letter)
index = 0
while True:
if index == letter_index:
break
letter = next(lowercase_letters_cycle)
index = 1
return lowercase_letters_cycle
但是有沒有更短的方法?
uj5u.com熱心網友回復:
該itertools
檔案提供了使用迭代器中的多個專案的配方。
from itertools import islice
import collections
def consume(iterator, n=None):
"Advance the iterator n-steps ahead. If n is None, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
因此,您創建了回圈,然后在繼續之前消耗一點它。
lowercase_letters_cycle = itertools.cycle(string.ascii_lowercase)
consume(lowercase_letters_cycle, ord('n') - ord('a'))
assert next(lowercase_letters_cycle) == 'n')
同樣consume
也可以從第三方more-itertools
包中獲得。
uj5u.com熱心網友回復:
您可以按如下方式組合islice
和cycle
from模塊:itertools
import string
import itertools
my_it = itertools.islice(itertools.cycle(string.ascii_lowercase), 3, None)
它將產生d
(前 3 個字符之后的字符),然后e
, ...., 然后z
, 然后a
, 然后b
, 等等。您可以將第二個引數中的數字更改為islice
從不同的字母開始。
uj5u.com熱心網友回復:
您可以只切片輸入串列以從您選擇的索引開始。
offset = 10
lowercase_letters = list(string.ascii_lowercase)
# offset_index to end start to offset_index-1
offset_letters = lowercase_letters[offset:] lowercase_letters[:offset]
offset_letters_cycle = itertools.cycle(offset_letters)
然后,
for i in range(10):
print(next(offset_letters_cycle), end=" ")
印刷:
k l m n o p q r s t
uj5u.com熱心網友回復:
import string
from itertools import cycle, dropwhile
def start_cycle(letter):
return dropwhile(lambda x: x!= letter, cycle(string.ascii_lowercase))
itertools.dropwhile
將可迭代的結果提供給它的哨兵函式 - 在這種情況下lambda x: x != letter
,并將“吞下”結果,直到函式False
第一次回傳。此時不再呼叫該函式,并且迭代繼續,產生任何進一步的值。
另外,請注意無需轉換ascii_lowercase
為串列,因為字串已經是可迭代的。
請記住,如果傳遞了一個不在 ascii_lowercase 中的字符,這將進入一個 100% CPU 的無限回圈。最好用檢查來保護它:
def start_cycle(letter):
if letter not in string.ascii_lowercase:
raise ValueError()
return dropwhile(lambda x: x!= letter, cycle(string.ascii_lowercase))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/461540.html