迭代" 1或更多"迭代器对象中的元素?

时间:2014-11-21 00:28:02

标签: python for-loop iteration conditional

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

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

4 个答案:

答案 0 :(得分:2)

for record in myList:
    wait = None
    if isinstance(record,(list,tuple)):
       record,wait = record

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

答案 1 :(得分:1)

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

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使用{{3}}返回原始元组,或者元组内的整数,第二个元素设置为零。

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

答案 2 :(得分:0)

您有几个选择:

  • 始终让iterator_obj同时返回记录和延迟,并在您不需要时忽略延迟:

    for record, _ in iterator_obj

  • 使用不同的方法返回不同的迭代器:

    for record, delay in iterajtor_obj.iterate_with_delay()

答案 3 :(得分:0)

以列表为例:

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

此输出[(2,3),(3,4)] 希望这有用。