2014-11-21 86 views
1

我试图找到一个这样做的优雅方式。我基本上有一个返回记录的类。 我使用一个基本迭代器这样的:在迭代器对象中迭代“1个或更多”元素?

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

如何更改第一个返回'(record,0)'(或任何默认延迟)的元组,并使用相同的代码路径? – 2014-11-21 00:33:16

回答

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

可能是什么你想......

+0

或'记录,等待= ele如果isinstance(ele,tuple)else ele,None' – 2014-11-21 01:15:39

+0

是的,解决它。第一次使用isinstance。谢谢! 我会用固定代码更新我的问题。 – Balrizangor 2014-11-21 01:24:29

0

你有几个选择:

  • 总是有回报iterator_obj记录和延迟两,并且在你不需要时忽略延迟:

    for record, _ in iterator_obj

  • 做出不同的方法以返回不同的迭代器:

    for record, delay in iterajtor_obj.iterate_with_delay()

+0

这可能是正确的方法,但暂时我无法改变返回记录/等待的类,使其变得统一。 – Balrizangor 2014-11-21 00:56:06

0

采取列表例如:

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

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

+0

如果它没有被返回,我认为我不能评估y(y> 2)。 – Balrizangor 2014-11-21 00:58:04

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

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

+0

我用了另一个答案,但保存了你的答案,因为它看起来非常复杂。谢谢! – Balrizangor 2014-11-21 01:28:24