在python中将布尔值转换为整数位置

在python中将布尔值转换为整数位置,python,Python,我有一个布尔列表,比如: x = [True, False, False, True] 如何将此列表转换为整数位置,以便获得结果: y = [1, 4] ?您可以将列表理解与函数结合使用,例如: >>> x = [True, False, False, True] >>> [index for index, element in enumerate(x, start=1) if element] [1, 4] 或者,如果您愿意使用NumPy并获得类型为N

我有一个布尔列表,比如:

x = [True, False, False, True]
如何将此列表转换为整数位置,以便获得结果:

y = [1, 4]

您可以将列表理解与函数结合使用,例如:

>>> x = [True, False, False, True]
>>> [index for index, element in enumerate(x, start=1) if element]
[1, 4]
或者,如果您愿意使用NumPy并获得类型为
NumPy.ndarray
的结果,则有一个NumPy函数(几乎)可以满足您的需要:

上面一行中奇怪的
[0]
之所以出现,是因为
numpy。其中
总是在一个元组中返回其结果:输入数组的每个维度都有一个元组元素。因为在这种情况下,输入数组是一维的,所以我们并不真正关心外部元组结构,所以我们使用
[0]
索引操作来提取我们需要的实际数组。
+1
可以从Python/NumPy标准的基于0的索引转换为基于1的索引,看起来就像您在这里想要的那样


如果您正在处理大型输入数据(尤其是如果输入列表已经是NumPy数组的形式),NumPy解决方案可能比列表理解快得多。

简单的一行代码是:

[i+1 for i in range(len(x)) if x[i]]

在列表中使用
枚举

>>> [i for i, j in enumerate(x, 1) if j]
[1, 4]

请注意,这是一个
列表
而不是一个
数组
:“数组”对大多数Python用户(尤其是NumPy用户)有不同的含义。考虑到您的配置文件中的R问题和交叉验证活动,数组可能比列表更好地为您服务。是的,看起来是这样的,尽管我不得不说@MarkDickinson的答案非常清楚。谢谢你的回答和解释!我需要了解很多信息。这绝对是对R的一种改变,在R中,您可以只执行
哪个(x)
,然后就可以完成了@J4y:我猜
numpy。where
有点像Python对
的回答,which
。如果您来自R,那么您几乎肯定希望了解Python+NumPy,而不是纯Python。
>>> [i for i, j in enumerate(x, 1) if j]
[1, 4]