簡體   English   中英

使用布爾索引從Python列表中切割元素

[英]Slicing elements from a Python list using Boolean indexing

我最近遇到過用Python切片列表的方式。 我以前從未見過這個,所以我想清楚地理解這一點。

我有一個列表["Peter", "James", "Mark"]如果我使用布爾值False對其進行切片,則返回Peter ,如果我使用True切片,則返回James ,如下所示

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

我想知道這里發生了什么,這個方法叫做什么?

這里的__index__鈎子是__index__魔術方法:

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

當使用下標訪問時,使用obj的__index__返回的值,允許任意對象與切片一起使用:

x[obj]

這有點獨立於boolint的子類這一事實! 您可以使用任何對象實現相同的目標。

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

是否為int子類解析__index__取決於實現細節。

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數據模型正確運行。 看起來CPython正在進行快捷/性能優化。

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

print (True + True)將給出輸出2

所以在列表中['peter', 'john', 'abhi'][True]返回列表中的第二個元素,即john

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM