Python列表切片与任意指数

Ben*_*ner 38 python list slice

有没有更好的方法从python中的列表中提取任意索引?

我目前使用的方法是:

a = range(100)
s = [a[i] for i in [5,13,25]]
Run Code Online (Sandbox Code Playgroud)

其中a是我要切片的数组,[5,13,​​25]是我想要的元素.它似乎比Matlab等价物更冗长:

a = 0:99;
s = a([6,14,26])
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 45

>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)
Run Code Online (Sandbox Code Playgroud)

  • 如果使用列表作为索引,请注意此边缘条件:indices = [1,]; itemgetter(*indexes)(a)---->返回一个整数,而不是一个元组 (5认同)
  • 注意@DarrenRinger在这里意味着如果你想要的索引在列表中,你会写`itemgetter(*indices)(list)` (3认同)
  • 谢谢你!有了这个函数,我一定是第一次遇到真正需要unpack *运算符的情况。 (2认同)
  • 很好,我希望这是默认行为 - 如果它会麻烦并告诉我它不能接受元组索引它也可能尝试先使用元组.我在习惯了以类似方式解决IPython集群节点的想法后来到这里. (2认同)

unu*_*tbu 22

如果您是Matlab用户,但想要使用Python,请查看numpy:

In [37]: import numpy as np

In [38]: a = np.arange(100)

In [39]: s = a[[5,13,25]]

In [40]: s
Out[40]: array([ 5, 13, 25])
Run Code Online (Sandbox Code Playgroud)

这是NumPy和Matlab比较,这是一个常见的Matlab命令及其在NumPy中的等价物表.


jsb*_*eno 11

没有"现成的"方式 - 你这样做的方式是非常自然的,你可以使用它.如果你的代码中有很多东西,你可能想要使用像matlabs一样使用语法的列表的子类 - 它可以在几行代码中完成,主要负担是你必须工作总是使用这个新类而不是内置列表.

class MyList(list):
    def __getitem__(self, index):
        if not isinstance(index, tuple):
            return list.__getitem__(self, index)
        return [self[i] for i in index]
Run Code Online (Sandbox Code Playgroud)

在控制台上:

>>> m = MyList(i * 3 for i in range(100))
>>> m[20, 25,60]
[60, 75, 180]
Run Code Online (Sandbox Code Playgroud)