簡體   English   中英

迭代迭代器對象中的“1個或更多”元素?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM