我有一个布尔列表,比如说:
x = [True, False, False, True]
如何将此列表转换为整数位置,以便获得结果:
y = [1, 4]
答案 0 :(得分:11)
您可以将列表推导与enumerate函数结合使用,例如:
>>> x = [True, False, False, True]
>>> [index for index, element in enumerate(x, start=1) if element]
[1, 4]
或者,如果您愿意使用NumPy并获得numpy.ndarray
类型的结果,那么NumPy功能(几乎)可以满足您的需求:numpy.where
。< / p>
>>> import numpy
>>> numpy.where(x)
(array([0, 3]),)
>>> numpy.where(x)[0] + 1
array([1, 4])
上面一行中的奇怪[0]
是因为numpy.where
总是在元组中返回其结果:输入数组的每个维度的元组的一个元素。由于在这种情况下输入数组是一维的,我们并不真正关心外部元组结构,因此我们使用[0]
索引操作来提取我们需要的实际数组。 + 1
可以从Python / NumPy标准的基于0的索引到基于1的索引,它看起来就像你想要的一样。
如果您正在处理大量输入数据(特别是如果输入列表已经是NumPy数组的形式),则NumPy解决方案可能比列表理解速度快得多。
答案 1 :(得分:8)
在列表理解中使用enumerate
:
>>> [i for i, j in enumerate(x, 1) if j]
[1, 4]
答案 2 :(得分:2)
一个简单的单行将是:
[i+1 for i in range(len(x)) if x[i]]