18

想象一些 numpy 数组,例如x = np.linspace(1,10).

x[i:j]让我了解x范围[i,j)。我喜欢我也可以做x[i:-k]的,它排除了最后一个k元素。

但是,为了包含我需要做的最后一个元素x[i:]

我的问题是:例如,如果我需要遍历k.

说我想这样做:

l = list()
for k in [5,4,3,2,1]:
    l.append(x[:-k])
l.append(x[:])

让我恼火的是最后一行。当然,在这个简单的例子中,它并没有太大的区别,但有时这会变得更烦人。我想念的是更干燥的东西。

以下片段课程不会产生预期的结果,但代表了我寻求的代码风格:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:-k])
4

4 回答 4

21

这有点痛苦,但由于-0与 相同0,因此没有简单的解决方案。

一种方法是:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:-k or None])

这是因为 whenk是 0,-k or NoneNone,并且x[:None]会做你想做的事。对于 的其他值k-k or None将是-k

我不确定我自己是否喜欢它。

于 2013-03-26T00:42:20.080 回答
11

你不能,因为 -0 在 python 中不会那样切片(它变成 0)

你可以做老派:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:len(x)-k])
于 2013-03-26T00:49:47.220 回答
6

切片中的 valueNone与不放任何内容相同。换句话说,x[:None]与 相同x[:]。所以:

l = list()
for k in [-5,-4,-3,-2,-1,None]:
    l.append(x[:k])

但是……这段代码写成列表理解要容易得多:

l = [x[:k] for k in (-5,-4,-3,-2,-1,None)]

或者......你可能想看看你正在尝试做的任何事情,看看是否有更高级的抽象是有意义的,或者可能只是另一种组织更易读的东西的方式(即使它有点冗长) . 例如,根据x实际表示的内容,这可能更容易理解(当然也可能更难理解):

l = []
for k in range(6):
    l.insert(0, x)
    x = x[:-1]
于 2013-03-26T00:46:04.940 回答
0

那么,也许是这样:

l = list()
for k in [5,4,3,2,1,None]:
    l.append(x[:-k if k else None])

如果x是简单range(10)的,上面的代码将产生:

[[0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4, 5],
 [0, 1, 2, 3, 4, 5, 6],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]    
于 2013-03-26T00:42:13.490 回答