18

いくつかの厄介な配列を想像してみてくださいx = np.linspace(1,10)

x[i:j]x範囲のビューを表示します[i,j)。最後の要素x[i:-k]を除いてできることも大好きです。k

ただし、最後の要素を含めるには、実行する必要がありますx[i:]

私の質問はこれです:たとえばループする必要がある場合、これら2つの表記をどのように組み合わせるのですか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なので簡単な解決策はありません。

それを行う1つの方法は次のとおりです。

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

これは、kが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

スライス内の値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]
于 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 に答える