Python列表切片与任意指数

时间:2012-02-02 01:52:54

标签: python list slice

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

我目前使用的方法是:

a = range(100)
s = [a[i] for i in [5,13,25]]

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

a = 0:99;
s = a([6,14,26])

5 个答案:

答案 0 :(得分:42)

>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)

答案 1 :(得分:19)

如果您是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])

以下是comparison of NumPy and Matlab,这是一张常见的Matlab commands and their equivalents in NumPy表。

答案 2 :(得分:10)

没有“现成的”方式 - 你这样做的方式非常自然,你可以使用它。 如果你的代码中有很多东西,你可能想要使用像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]

在控制台上:

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

答案 3 :(得分:0)

以下是优秀的@John La Rooy answer的强大版本。它通过提供的doctests。它总是返回一个列表。

def slice_by_index(lst, indexes):
    """Slice list by positional indexes.

    Adapted from https://stackoverflow.com/a/9108109/304209.

    Args:
        lst: list to slice.
        indexes: iterable of 0-based indexes of the list positions to return.

    Returns:
        a new list containing elements of lst on positions specified by indexes.

    >>> slice_by_index([], [])
    []
    >>> slice_by_index([], [0, 1])
    []
    >>> slice_by_index(['a', 'b', 'c'], [])
    []
    >>> slice_by_index(['a', 'b', 'c'], [0, 2])
    ['a', 'c']
    >>> slice_by_index(['a', 'b', 'c'], [0, 1])
    ['a', 'b']
    >>> slice_by_index(['a', 'b', 'c'], [1])
    ['b']
    """
    if not lst or not indexes:
        return []
    slice_ = itemgetter(*indexes)(lst)
    if len(indexes) == 1:
        return [slice_]
    return list(slice_)

答案 4 :(得分:-1)

好像你会这样做:

    a = list(range(99)) 
    s = [a[5], a[13], a[25]] 

这似乎与matlab版本几乎完全相同。