比较两个列表时输出不正确

时间:2013-05-12 22:21:37

标签: python list python-3.x iteration

我正在尝试比较两个列表以生成买入/卖出信号。第一个列表是价格列表,而第二个列表是这些价格的简单移动平均值。

result = [590.0, 600.0, 590.0, 580.0, 570.0, 560.0, 570.0]
avrg = [580.0, 590.0, 593.33, 590.0, 580.0, 570.0, 566.67]
signal = ''

for prices in range(len(result)):
    for averages in range(len(avrg)):
        if result[prices] > avrg[averages]:
            signal = 'BUY'
        elif result[prices] < avrg[averages]:
            signal = 'SELL'
    lst.append(signal)

输出

['BUY', 'BUY', 'BUY', 'BUY', 'BUY', 'SELL', 'BUY']

输出应为

['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']

2 个答案:

答案 0 :(得分:2)

您没有循环遍历resultavrg的相应元素,而是循环遍历每个组合。例如,如果您将print(result[prices], avrg[averages])粘贴到循环中,则会看到

590.0 580.0
590.0 590.0
590.0 593.33
590.0 590.0
590.0 580.0
590.0 570.0
590.0 566.67
600.0 580.0
600.0 590.0
600.0 593.33
[.. etc.]

因此,附加的signal实际上是将result[prices]avrg last 元素进行比较的结果。

我认为你真正想做的是比较相应的术语,我们可以使用zip。而且,在Python中,我们可以直接遍历列表,而不需要通过索引访问它们。例如:

>>> list(zip(result, avrg))
[(590.0, 580.0), (600.0, 590.0), (590.0, 593.33), (580.0, 590.0), 
(570.0, 580.0), (560.0, 570.0), (570.0, 566.67)]

所以我们可以写

lst = []
for price, average in zip(result, avrg):
    if price > average:
        signal = 'BUY'
    else:
        signal = 'SELL'
    lst.append(signal)

(为简单起见,忽略了price == average案例)

产生

>>> lst
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']

在这里,我们甚至可以使用列表理解而不是循环:

>>> ['BUY' if price > average else 'SELL' for price, average in zip(result, avrg)]
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']

但逻辑越复杂,只需编写一个清晰的for循环就越好。

在任何情况下,我认为基本问题是你正在做一个完整的全价格与全部平均比较,并在你真正想要比较相应元素时取最后一个值。

[PS:我刚注意到一些奇怪的事情。当价格高于平均水平时,是不是错误的购买方式?你不应该在低于平均水平时购买,并在高于平均水平时出售吗?]

答案 1 :(得分:0)

result = [590.0, 600.0, 590.0, 580.0, 570.0, 560.0, 570.0]
avrg = [580.0, 590.0, 593.33, 590.0, 580.0, 570.0, 566.67]
signal = []
for i in range(len(result)):
  if (result[i] > avrg[i]):
    signal.append('BUY')
  else:
    signal.append('SELL')

给出

>>> signal
['BUY', 'BUY', 'SELL', 'SELL', 'SELL', 'SELL', 'BUY']