[英]Iterate over “1 or more” elements in iterator object?
我正試圖找到一種優雅的方式來做到這一點。 我基本上有一個返回記錄的類。 我為此使用了一個基本的迭代器:
i = 0
if mode == "sim":
for record in iterator_obj:
try:
s.sendall(record)
time.sleep(delay)
i += 1
但是,此迭代器類已被修改,因此如果使用命令行開關,則返回(記錄,延遲)元組。
我在time.sleep中使用的延遲(延遲)
這看起來像這樣(如果迭代器沒有返回延遲,這顯然會失敗):
for record, wait in iterator_obj:
if wait == 0:
pass
else:
delay = wait
if verbose:
print ('\n[+] Waiting {} seconds to send next record'.format(delay))
try:
s.sendall(record)
time.sleep(delay)
i += 1
它有很多浪費的行,有沒有辦法為1個或多個元素做一個條件循環?
for x, y (if y) in iterator_object
解
訣竅是使用isinstance來檢查元組。 更新的代碼如下:
for record in iterator_obj:
wait = None
if isinstance(record,(list,tuple)):
record,wait = record
if wait == 0 or wait is None:
pass
else:
delay = wait
if verbose:
print ('\n[+] Waiting {} seconds to send next record'.format(delay))
for record in myList:
wait = None
if isinstance(record,(list,tuple)):
record,wait = record
可能是你想要的......
也許這個答案有點過分,但我認為它可以滿足您的需求。 盡管如此,這可能不是你想要的,因為它是一個相當丑陋的表達。 以下是它的工作原理示例:
In [1]: iterable = [(1,2), (0,1), 2, 4]
In [2]: [(lambda *z: isinstance(z[0], tuple) and z[0] or (z[0], 0))(x) for x in iterable
Out[2]: [(1, 2), (0, 1), (2, 0), (4, 0)]
最后一個術語是可迭代的,應該用迭代器替換。 返回的每個元素都通過lambda函數運行,該函數使用和 - 或技巧返回原始元組,或元組內的整數,第二個元素設置為零。
從本質上講,它允許您按照要求處理多種形式的輸入。 但它的可讀性低於你想要的。
你有幾個選擇:
總是讓iterator_obj
返回記錄和延遲,只是在你不需要時忽略延遲:
for record, _ in iterator_obj
使用不同的方法返回不同的迭代器:
for record, delay in iterajtor_obj.iterate_with_delay()
以列表為例:
l=[(1,2),(2,3),(3,4)]
[(x,y) for x,y in list if y>2]
這個輸出[(2,3),(3,4)]希望這有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.