【问题标题】:Iterate over "1 or more" elements in iterator object?迭代迭代器对象中的“1个或多个”元素?
【发布时间】:2015-01-19 01:24:29
【问题描述】:

我正在尝试找到一种优雅的方式来做到这一点。我基本上有一个返回记录的类。 我为此使用了一个基本的迭代器:

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 循环?

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))

【问题讨论】:

  • 如何更改第一个以返回 (record, 0) 的元组(或任何默认延迟),并为两者使用相同的代码路径?

标签: python for-loop iteration conditional


【解决方案1】:
for record in myList:
    wait = None
    if isinstance(record,(list,tuple)):
       record,wait = record

可能是你想要的......

【讨论】:

  • record, wait = ele if isinstance(ele, tuple) else ele,None
  • 是的,解决了它。第一次使用isinstance。谢谢!我将使用固定代码更新我的问题。
【解决方案2】:

你有几个选择:

  • 总是让iterator_obj返回记录和延迟,当你不需要它时忽略延迟:

    for record, _ in iterator_obj

  • 制作不同的方法来返回不同的迭代器:

    for record, delay in iterajtor_obj.iterate_with_delay()

【讨论】:

  • 这可能是正确的方法,但目前我无法更改返回记录的类/等待使其统一。
【解决方案3】:

以列表为例:

l=[(1,2),(2,3),(3,4)]
[(x,y) for x,y in list if y>2] 

这个输出 [(2, 3), (3, 4)] 希望这会有所帮助。

【讨论】:

  • 如果 y (y>2) 甚至没有被返回,我认为我无法评估它。
【解决方案4】:

也许这个答案有点过头了,但我认为它可以满足您的需求。不过,这可能不是您想要的,因为它是一个相当丑陋的表达方式。以下是其工作原理的示例:

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 function 运行,它使用and-or trick 来返回原始元组,或者第二个元素设置为零的元组内的整数。

本质上,它允许您按照您的要求处理多种形式的输入。但它的可读性不如你想要的。

【讨论】:

  • 我使用了另一个答案,但保存了你的答案,因为它看起来非常复杂。谢谢!
猜你喜欢
  • 2021-11-21
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多