抵消迭代器

时间:2011-01-28 04:17:15

标签: python

我有这个:

d = {"date": tuple(date),"open":tuple(open),"close":tuple(close)}

comp1 = zip(d['open'],d['close'])

for i in comp1:   
    if i[0]<i[1]:
        print "bar up"

    if i[0]>i[1]:
        print "bar down"

这一切都很好,它告诉我一个条是上升还是下降,现在我想“转移”我的迭代(例如一个),但我不知道它的语法。逻辑是:

“如果PREVIOUS栏已经打开那么打印”是“如果CURRENT栏也是UP”。

有意义吗?

欢呼声,

4 个答案:

答案 0 :(得分:2)

如果你正在使用zip迭代器,为什么不把它带到一个新的水平?

comp1 = zip(d['open'],d['close'],d['open'][1:],d['close'][1:])
只要元组的长度大于1,就可以得到它。现在你不仅可以迭代元组,还可以迭代每个元组的下一个元素。

答案 1 :(得分:2)

up = lambda a, b: a < b
for prev, b in zip(comp1, comp1[1:]):
    if up(*prev) and up(*b):
       print "yes"

解释

  • up = lambda a, b: a < b创建两个参数的函数。它相当于operator.lt
  • for prev, b in zip(comp1, comp1[1:]):使用序列解包(与:x, y = "xy"),zip()函数,列表slicing相同。
  • if up(*prev) and up(*b):使用function calls*expression语法。

答案 2 :(得分:1)

您可能需要在循环中使用一些简单的逻辑,从而实现您所需的功能。请参阅以下内容以获得一个粗略的想法

PreviousWasUp = False
for i in comp1:
    ...
    if i[0] > i[1]:
        if PreviousWasUp:
           print "bar up"
        PreviousWasUp = True
    else:
        PreviousWasUp = False

答案 3 :(得分:0)

您可以将当前进行的迭代转换为列表推导,然后迭代获得的列表:

bars = [i[0]<i[1] for i in comp1]

for b in range(1,len(bars)):
    if bars[b] and bars[b-1]:
        print "yes"