想象一下numpy数组,例如x = np.linspace(1,10)
。
x[i:j]
让我了解范围x
的{{1}}。
我喜欢我也可以[i,j)
排除最后x[i:-k]
元素。
但是,为了包含我需要做的最后一个元素k
。
我的问题是:如果我需要循环x[i:]
,如何组合这两种符号。
说我想这样做:
k
让我烦恼的是最后一行。在这个简单的例子当然,它没有太大的区别,但有时这会变得更加烦人。我想念的是更像DRY的东西。
以下代码段不会产生预期的结果,但代表了我寻求的代码样式:
l = list()
for k in [5,4,3,2,1]:
l.append(x[:-k])
l.append(x[:])
先谢谢。
答案 0 :(得分:10)
这有点痛苦,但由于-0
与0
相同,因此没有简单的解决方案。
一种方法是:
l = list()
for k in [5,4,3,2,1,0]:
l.append(x[:-k or None])
这是因为当k
为0时,-k or None
为None
,而x[:None]
会执行您想要的操作。对于k
的其他值,-k or None
将为-k
。
我不确定自己是否喜欢它。
答案 1 :(得分:8)
你不能,因为-0没有在python中切片(它变为0)
你可以做旧学校:
l = list()
for k in [5,4,3,2,1,0]:
l.append(x[:len(x)-k])
答案 2 :(得分:4)
切片中的值None
与放置任何内容的值相同。换句话说,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]
答案 3 :(得分: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]]