【问题标题】:Is there a way to use operator.itemgetter with slice notation?有没有办法将 operator.itemgetter 与切片表示法一起使用?
【发布时间】:2020-05-12 21:59:25
【问题描述】:

我在 python 列表lst 中有一堆 numpy 数组。例如,我可以通过使用[:, 1] 对其进行索引来分割其中一个数组以获得特定视图。

我需要将此切片操作应用于lst 中的所有 numpy 数组。使用生成器理解,我可以这样做:

(my_array[:, 1] for my_array in lst)

我想知道是否有办法用operator.itemgettermap 完成同样的事情。

map(operator.itemgetter(:, 1), lst) 毫无疑问会导致语法错误。

【问题讨论】:

  • 为什么?我的印象是maplist comprehension 的速度差不多。我发现理解更易读。
  • @hpaulj 我喜欢使用map / filter 过度理解的原因是1)避免命名局部变量和2)为了简洁(特别是当我有像itemgetter这样的方法时和attrgetter 导入本地命名空间)。
  • itemgetter 是一个具有可读 python 代码的类。如文档所述,它主要被设计为对列表进行“高级索引”的一种方式,用列表索引列表(数组已经允许这样做)。

标签: python numpy slice


【解决方案1】:

切片语法为您生成slice 对象。您必须明确创建它们以传递给itemgetter。由于itemgetter(x,y)(a) 等价于(a[x], a[y]),因此您还需要使用括号来确保传递一个由sliceint 索引组成的tuple

# [:] -> slice(None)
map(operator.itemgetter((slice(None), 1)), lst)

搞清楚切片语法到底是做什么的一个有用的工具是定义一个小类

class A:
    def __getitem__(self, key):
        print(key)

然后您可以进行快速检查,例如

>>> A()[:,1]
(slice(None, None, None), 1)

slice(None)slice(None, None, None) 的缩写。)

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2016-11-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多