Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以列表/元组的形式获取布尔列表中truthy元素的索引_Python_Json_List - Fatal编程技术网

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

Python 以列表/元组的形式获取布尔列表中truthy元素的索引,python,json,list,Python,Json,List,给定一个布尔列表,如[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) 但是,当我想

给定一个布尔列表,如
[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
不会对生成器进行编码。

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

[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))
或者使用原始函数,然后从生成器创建列表:

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]
编辑:


事实上,速度要慢得多,因此肯定没有一个可以使用。

如果有办法将列表转换为numpy数组,请使用numpy。其中()应该更快:

> python -m timeit -s "import numpy" -s "values = numpy.array([True, False]*10000)" "numpy.where(values)"
1000 loops, best of 3: 392 usec per loop

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

但我可能在这里作弊,在设置中进行转换。

那是列表吗?这是最快的解决方案吗?@MLister要么使用这个,要么使用
numpy
;你必须花时间知道什么更快,但这一个可能是最短的,列表理解也非常优化。我从来不知道
enumerate
有第二个参数。请告诉我(使用numpy)…但是如果你将numpy.array部分移出设置,它会变慢。