以list/tup的形式获取布尔列表中truthy元素的索引

2024-09-28 20:43:31 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个布尔列表,比如[True, False, False, True, False, True],获取包含原始列表中Truthy元素的索引(从1开始,而不是从零索引)的列表/元组的最快方式是什么?所以对于上面的列表,它应该返回[1, 4, 6](1, 4, 6)

我用的发电机是这样的:

def get_truthy_ones(self, bool_list):
    return (idx + 1 for idx, value in enumerate(bool_list) if value)

然而,当我想在JSON对象中编码结果时,这会产生一个问题,因为JSON不编码生成器。


Tags: jsonfalsetrue元素编码列表valuedef
3条回答
[i for i, elem in enumerate(bool_list, 1) if elem]

将括号切换为方括号以返回列表而不是生成器:

def get_truthy_ones(self, bool_list):
    return [idx for idx, value in enumerate(bool_list, 1) if value]

或者使用原始函数,然后从生成器创建列表:

list(get_truthy_ones(self, bool_list))

仅仅因为它是可以做到的,一个带有itertools.compress()的替代版本。我认为这比其他例子可读性差,所以我不推荐它。

>>> list(itertools.compress(*zip(*enumerate([True, False, False, True, False, True], 1))))
[1, 4, 6]

编辑:

python -m timeit -s "import itertools" -s "values = [True, False]*10000" "list(itertools.compress(*zip(*enumerate(values, 1))))"
100 loops, best of 3: 2.88 msec per loop

python -m timeit -s "import itertools" -s "values = [True, False]*10000" "[index for index, value in enumerate(values, 1) if value]"
1000 loops, best of 3: 1.11 msec per loop

明显较慢,事实上,所以绝对不能使用。

相关问题 更多 >