文档中指出:
列表是可变序列,通常用于存储同类数据的集合(具体相似程度因应用而异)。
您不应该在列表中存储异构数据。使用list.index
时,实现仅使用Py_EQ
(==
运算符)进行比较。在您的情况下,该比较返回真值,因为True
和False
的值分别为整数1和0(毕竟bool类是int的子类)。
然而,您可以像这样使用生成器表达式和next
内置函数(来获取生成器中的第一个值):
In [4]: next(i for i, x in enumerate(lst) if not isinstance(x, bool) and x == 1)
Out[4]: 2
在比较x
和1之前,我们检查x
是否为bool
的实例。
请记住,next
可能会引发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
list.index(1)
返回0
,尽管你感到惊讶,或者你真的不应该让自己陷入需要进行这种搜索的局面中。 - user1084944