【问题标题】:Slicing elements from a Python list using Boolean indexing使用布尔索引从 Python 列表中切片元素
【发布时间】:2018-09-12 23:10:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • @xg.plt.py,我错了。看看下面wim的答案。

标签: python python-3.x list slice


【解决方案1】:

这里的数据模型钩子是__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'

根据Python datamodel,PyPy 的行为正确。看起来 CPython 正在走捷径/性能优化。

【讨论】:

  • A MyInt 已经是一个 int,因此 Python 实际上不需要执行到 int 的转换。我想说这两个结果都与数据模型一致。
【解决方案2】:

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

print (True + True) 将输出2

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

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2013-08-03
    • 2021-12-02
    • 2016-08-24
    • 2021-01-19
    • 2012-09-23
    相关资源
    最近更新 更多