Python:List.Index(x),在位置0

时间:2016-11-30 03:19:53

标签: python string python-2.7 list slice

为什么list.index(x)在位置0之后切片索引时找不到匹配?

此语句正确设置closed_order = 0。

closed_order = trades[:][0].index(strategy)

但是下面的陈述找不到价值。我希望它能回归4.

closed_order = trades[2:][0].index(strategy)

if语句也能正确找到匹配项。

整个代码如下所示。

from decimal import Decimal, getcontext
getcontext().prec = 2

trades = [['shp_str_sl_17_(Clsd Prft)', '12/18/11', Decimal('4.66')],
          ['shp_str_sl_17_(Re)', '12/18/11', Decimal('4.61')],
          ['shp_str_sl_17_(Re)', '1/22/12', Decimal('5.62')],
          ['shp_str_sl_17_(OBV X^)', '1/29/12', Decimal('6.63')],
          ['shp_str_sl_17_(Clsd Prft)', '3/11/12', Decimal('6.84')],
          ['shp_str_sl_17_(UDR 0^)', '7/29/12', Decimal('5.03')],
          ['shp_str_sl_17_(Clsd Prft)', '10/28/12', Decimal('5.60')]]

strategy = 'shp_str_sl_17_(Clsd Prft)'
if trades[4][0] == strategy:
        print "match found"

closed_order = trades[2:][0].index(strategy)
print "closed_order=",closed_order

我是Python新手并感谢他们的帮助。 谢谢。 最好的祝福, 桑杰

1 个答案:

答案 0 :(得分:3)

[2:]表示“从2开始给我元素”。 [0]表示“给我第一个元素”。因此trades[2:][0]表示“从2开始向我提供元素的第一个元素” - 这与仅仅trades[2]相同。这不包含您的strategy

同样,在您的第一个示例中,trades[:][0]trades[0]相同。这恰好适用于您的示例,因为trades[0]确实包含您的目标策略。

你不清楚你的想法是什么trades[2:][0],但也许你认为[0]意味着“给我每个子列表的第一个元素”。但这并不意味着什么。如果你想要,你必须使用列表理解:

[sub_list[0] for sub_list in trades[2:]].index(strategy)

但是,这不会给你4,而是2,因为通过切片trades你已经改变了新列表的开始位置。以前位于第4位的元素现在位于第2位,因为您在开头处关闭了2个元素。