有条件地枚举 python 中的项目
Conditionally enumerating items in python
我想在满足特定条件的可迭代对象中枚举那些项目。我尝试过
[(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 方式来达到预期的效果?
请注意,在我处理的实际问题中,我事先并不知道有多少项满足条件。
您可以在生成器中进行过滤,然后对该表达式的结果进行枚举。
>>> [(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)]
最后进行枚举,以便索引从 0 开始。
enumerate(j for j in range(10) if (3 < j) and (j < 8))
如果您需要列表而不是枚举对象,只需将其全部包装在 list()
中
为什么你错了:你得到结果然后过滤它。
[(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)]
一句话,记得先过滤。
我想在满足特定条件的可迭代对象中枚举那些项目。我尝试过
[(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 方式来达到预期的效果?
请注意,在我处理的实际问题中,我事先并不知道有多少项满足条件。
您可以在生成器中进行过滤,然后对该表达式的结果进行枚举。
>>> [(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)]
最后进行枚举,以便索引从 0 开始。
enumerate(j for j in range(10) if (3 < j) and (j < 8))
如果您需要列表而不是枚举对象,只需将其全部包装在 list()
为什么你错了:你得到结果然后过滤它。
[(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)]
一句话,记得先过滤。