使用任意索引的Python列表切片

66 投票
5 回答
43929 浏览
提问于 2025-04-17 12:10

有没有更好的方法来从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 个回答

14

没有现成的方法可以直接使用——你现在的方法很聪明,可以继续用下去。如果你的代码中有很多这样的情况,可能想要使用一个列表的子类,这样就能用类似于Matlab的语法来写。这其实只需要几行代码就能实现,主要的麻烦是你得一直使用这个新类,而不是内置的列表。

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]
37

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

这里有一个NumPy和Matlab的对比,还有一个表格列出了常见的Matlab命令及其在NumPy中的对应命令

75

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。

例如,假设你在写一个游戏,想要让角色在遇到敌人时才能攻击。你可以设置一个条件,只有当角色的生命值大于0,并且敌人也在角色的攻击范围内时,角色才能进行攻击。这种方式可以帮助我们控制程序的行为,确保它按照我们设定的逻辑运行。

总之,条件判断就像是给程序设定了一些“如果……那么……”的规则,帮助它做出决策。

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

撰写回答