【问题标题】:Problem with list slice syntax in pythonpython中的列表切片语法问题
【发布时间】:2010-05-03 20:29:43
【问题描述】:

python的文档中提到了扩展索引语法。

slice([start], stop[, step])

使用扩展索引语法时也会生成切片对象。例如:a[start:stop:step]a[start:stop, i]。有关返回迭代器的替代版本,请参阅 itertools.islice()

a[start:stop:step] 按描述工作。但是第二个呢?它是如何使用的?

【问题讨论】:

  • 所以你问的是“a[start:stop, i]”中的“i”是什么意思?
  • 是的,如果 a 应该是一个序列,“i”是什么?
  • a 不一定是默认原始类型之一的序列。
  • 让我大吃一惊...如果我尝试类似 foo[3:7, 2] 之类的东西,它会引发 TypeError
  • 文档给我的印象是 a[start:stop, i] 应该像 a[start:stop:step] 一样工作。但事实并非如此。

标签: python syntax slice


【解决方案1】:

a[start:stop,i] 调用方法a.__getitem__((slice(start,stop,None), i))

如果a 是一个列表,这会引发一个TypeError,但如果a 是一个numpy 数组,它是有效且有用的表示法。事实上,我相信 Numpy 的开发人员要求 Python 的开发人员精确地扩展有效的 Python 切片表示法,以便更轻松地实现 numpy 数组切片表示法。

例如,

import numpy as np
arr=np.arange(12).reshape(4,3)
print(arr)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

1:3 选择第 1 行和第 2 行,2 选择第三列:

print(arr[1:3,2])
# [5 8]

PS。要试验发送到 __getitem__ 的切片,您可以 玩弄这个玩具代码:

class Foo(list):
    def __getitem__(self,key):
        return repr(key)

foo=Foo(range(10))
print(foo[1:5,1,2])
# (slice(1, 5, None), 1, 2)

【讨论】:

  • 我明白了。基本上,a[start:stop, i] 仅适用于在 numpy 中实现的多维数组。
  • @Dingle:或者,您可以使用__getitem__ 定义您自己的类并指定您自己的含义和行为!
  • 问题类似于stackoverflow.com/questions/752602/…,但你的例子和玩具代码更容易理解。
【解决方案2】:

符号[:,:] 用于分割multidimensional arrays。默认情况下,Python 没有任何多维数组,但语法支持它,例如 numpy 就利用了这种语法。

【讨论】:

  • 以及任何其他可能通过__getitem__()实现多维切片的自定义对象。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2023-02-25
  • 1970-01-01
  • 2018-08-31
  • 2010-12-14
相关资源
最近更新 更多