特定のインデックスのリスト(または配列など)のすべての要素exceptにインデックスを付ける簡単な方法はありますか?例えば。、
mylist[3]
は位置3のアイテムを返します
milist[~3]
は3を除くリスト全体を返します
listの場合、リストcompを使用できます。たとえば、3番目の要素なしでb
をa
のコピーにするには:
a = range(10)[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3] # [9, 8, 7, 5, 4, 3, 2, 1, 0]
これは非常に一般的で、numpy配列を含むすべての反復可能オブジェクトで使用できます。 []
を()
に置き換えると、b
はリストではなくイテレーターになります。
または、pop
を使用してインプレースでこれを実行できます。
a = range(10)[::-1] # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3) # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]
numpyでは、ブールインデックスを使用してこれを行うことができます。
a = np.arange(9, -1, -1) # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3] # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])
一般に、上記のリストの理解よりもはるかに高速です。
>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2]
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>>
こちらもご覧ください
私が見つけた最も簡単な方法は:
mylist[:x]+mylist[x+1:]
インデックスmylist
の要素なしでx
を生成します。
Numpyを使用している場合、最も近いのは、マスクを使用していると考えることができます
>>> import numpy as np
>>> arr = np.arange(1,10)
>>> mask = np.ones(arr.shape,dtype=bool)
>>> mask[5]=0
>>> arr[mask]
array([1, 2, 3, 4, 5, 7, 8, 9])
itertools
を使用せずにnumpy
を使用すると、同様のことが実現できます。
>>> from itertools import compress
>>> arr = range(1,10)
>>> mask = [1]*len(arr)
>>> mask[5]=0
>>> list(compress(arr,mask))
[1, 2, 3, 4, 5, 7, 8, 9]
np.delete
を使用してください!実際には何も削除されません
例:
import numpy as np
a = np.array([[1,4],[5,7],[3,1]])
# a: array([[1, 4],
# [5, 7],
# [3, 1]])
ind = np.array([0,1])
# ind: array([0, 1])
# a[ind]: array([[1, 4],
# [5, 7]])
all_except_index = np.delete(a, ind, axis=0)
# all_except_index: array([[3, 1]])
# a: (still the same): array([[1, 4],
# [5, 7],
# [3, 1]])
インデックスが事前にわからない場合は、ここで機能する関数があります
def reverse_index(l, index):
try:
l.pop(index)
return l
except IndexError:
return False
上記の回答では、0ベースの除外は考慮されていません。
def exclude(lst, i):
if i == 0:
return lst[i+1:]
return lst[:i] + lst[i+1:]