使用任意索引的Python列表切片
有没有更好的方法来从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)