2017-02-08 5 views
2

リストの要素を特定のスライスに含まないようにする構文はありますか?私が欲しい場合はリストスライスの補集合(逆)を得る

>>> l = [1,2,3,4,5] 
>>> l[1:4] 
[2, 3, 4] 

私にできるリストの残り: はスライス[1:4]を考えると、それはそれらの要素を取得するのは簡単です

>>> l[:1] + l[4:] 
[1, 5] 

は、さらにより簡潔な方法はありますこれを行う?これはすでに非常に簡潔であるため、私はあまりにも恵まれているかもしれないことを認識しています。

編集:元のリストを変更しないため、これはInvert slice in pythonの複製ではないと思います。

+3

これはあなたの望むものではないかもしれないので、私は答えの代わりにコメントに入れますが、元のリストを変更したい場合は、スライスに割り当てることができます。例えば'l [1:4] = []' – recursive

+0

numpy配列を使うこともできます。 – arshajii

+0

リストを操作しても構いませんが、それを元に戻すことはできません。del [1:4]できます。 – ryugie

答えて

1

あなたはその場でリストを変更したい場合は、スライスを削除することができます。

>>> l = [1, 2, 3, 4, 5] 
>>> del l[1:4] 
>>> l 
[1, 5] 

そうでなければ、あなたの元々の提案が最も簡潔な方法だろう。 1つのスライスステートメントを使用してリストスライスの反対を取得する方法はありません。

0

ステップ値として'c'を使用したときに発生するいくつかの魔法の動作をカプセル化するためのクラスを作成するための最良の解決方法は明らかです。明らかに。

class SuperList(list): 
    def __getitem__(self, val): 
     if type(val) is slice and val.step == 'c': 
      copy = self[:] 
      copy[val.start:val.stop] = [] 
      return copy 

     return super(SuperList, self).__getitem__(val) 


l = SuperList([1,2,3,4,5]) 
print l[1:4:'c'] # [1, 5] 
+1

明らかに。私は '' c ''を '' < - 何でもない、この範囲ではない、繰り返す ''に置き換えます。読みやすくするため。明らかに。私の目は痛い。 –

-2

あなたはループあまり簡潔で

l = [i for i in l if i not in l[1:4]] 
+0

これはいくつかの理由でうまくいかないでしょう。 1つの構文が無効です。 2番目に、もしあなたのリストが '[1,1,1,1,1]'だったら? – acushner

+0

申し訳ありません私はiを書くことを忘れました。 –

+0

とええ。上記のリスト条件では動作しません –

0
[x for i, x in enumerate(l) if i not in range(1, 4)] 

でリストの内包表記を使用することができます。あなたの質問への答えはいいえ、もっと簡潔にすることはできません。