有条不紊地枚举python中的项目

时间:2015-05-21 13:18:46

标签: python iterable

我想在满足特定条件的迭代中枚举这些项。我尝试过像

这样的东西
[(i,j) for i,j in enumerate(range(10)) if (3 < j) and (j < 8)]

(试图枚举4到7之间的数字只是为了举例)。从这里,我得到了结果

[(4, 4), (5, 5), (6, 6), (7, 7)]

我想得到的是

[(0, 4), (1, 5), (2, 6), (3, 7)]

是否有一种pythonic方法可以达到预期的效果?

请注意,在我正在处理的实际问题中,我事先并不知道有多少项符合条件。

3 个答案:

答案 0 :(得分:14)

枚举是否为最后,因此索引从0开始。

enumerate(j for j in range(10) if (3 < j) and (j < 8))

如果您需要列表而不是枚举对象,只需将其全部包装在list()

答案 1 :(得分:4)

您可以在生成器中进行过滤,然后对该表达式的结果进行枚举。

>>> [(index,value) for index,value in enumerate(j for j in range(10) if (3 < j) and (j < 8))]
[(0, 4), (1, 5), (2, 6), (3, 7)]

或者等效enumerate将产生(index, value)的元组,以便您可以使用

>>> list(enumerate(j for j in range(10) if (3 < j) and (j < 8)))
[(0, 4), (1, 5), (2, 6), (3, 7)]

答案 2 :(得分:2)

为什么你错了:你得到结果然后过滤它。

[(i,j) for i,j in enumerate(range(10))]将获得[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)],然后您使用if (3 < j) and (j < 8)(j是元组中的第二项),因此结果为[(4, 4), (5, 5), (6, 6), (7, 7)]

您应该做什么:首先过滤传递给range()的序列。

这意味着:例如,你想要枚举4到7之间的数字,所以你应该先进行过滤

>>> [j for j in range(10) if 3 < j < 8]
[4, 5, 6, 7]

然后将其传递给enumerate

>>> list(enumerate([4, 5, 6, 7]))
[(0, 4), (1, 5), (2, 6), (3, 7)]

所以,解决方案应该是:

>>> list(enumerate(i for in range(10) if 3 < i < 8))
[(0, 4), (1, 5), (2, 6), (3, 7)]

总之,只需记住先进行过滤