documentation说
Lists are mutable sequences, typically used to store collections of
homogeneous items (where the precise degree of similarity will vary by
application).
您不应该在列表中存储异构数据.
list.index的实现只使用Py_EQ(== operator)进行比较.在你的情况下,比较返回真值,因为True和False分别具有整数1和0(the bool class is a subclass of int)的值.
但是,您可以使用生成器表达式和built-in next function(从生成器获取第一个值),如下所示:
In [4]: next(i for i, x in enumerate(lst) if not isinstance(x, bool) and x == 1)
Out[4]: 2
在这里,我们检查x是否是一个bool的实例,然后将x比1.
请记住,接下来可以提高StopIteration,在这种情况下,可能希望(重新)引发ValueError(以模拟list.index的行为).
将这全部包含在一个函数中:
def index_same_type(it, val):
gen = (i for i, x in enumerate(it) if type(x) is type(val) and x == val)
try:
return next(gen)
except StopIteration:
raise ValueError('{!r} is not in iterable'.format(val)) from None
一些例子:
In [34]: index_same_type(lst, 1)
Out[34]: 2
In [35]: index_same_type(lst, True)
Out[35]: 0
In [37]: index_same_type(lst, 42)
ValueError: 42 is not in iterable