使用布尔索引从Python列表中切割元素

时间:2018-04-03 14:59:19

标签: python python-3.x list slice

我最近遇到过在Python中切片列表的方式。我以前从未见过这个,所以我想清楚地理解这一点。

我有一个列表["Peter", "James", "Mark"]如果我使用布尔值False对其进行切片,则会返回Peter,如果我使用True进行切片,则返回James ,如下所示

  • ["Peter", "James", "Mark"][False] => Peter
  • ["Peter", "James", "Mark"][True] => James

我想知道这里发生了什么,这个方法叫做什么?

2 个答案:

答案 0 :(得分:6)

这里的数据模型钩子是__index__魔术方法:

>>> True.__index__()
1
>>> False.__index__()
0

使用subscripting访问时,使用obj的__index__返回的值,允许任意对象与切片一起使用:

x[obj]

这有点独立于boolint的子类的事实!您可以使用任何对象实现相同的目标。

>>> class A:
...     def __index__(self):
...         return 1
...     
>>> 'ab'[A()]
'b'

是否为__index__子类解析int取决于实现细节。

CPython 3.7.1:

>>> class MyInt(int):
...     def __index__(self):
...         return 1
... 
>>> '01'[MyInt(0)]
'0'

PyPy 5.0.1:

>>>> class MyInt(int):
....     def __index__(self):
....         return 1
....         
>>>> '01'[MyInt(0)]
'1'

PyPy根据Python datamodel正确运行。看起来CPython正在进行快捷/性能优化。

答案 1 :(得分:2)

在Python中,bool类派生自int 因此True=1False=0

print (True + True)会输出2

因此,在列表['peter', 'john', 'abhi'][True]上返回列表的第二个元素,即john