web-dev-qa-db-ja.com

pythonの1つのアイテムをすべて*除く*インデックスを作成します

特定のインデックスのリスト(または配列など)のすべての要素exceptにインデックスを付ける簡単な方法はありますか?例えば。、

  • mylist[3]は位置3のアイテムを返します

  • milist[~3]は3を除くリスト全体を返します

83
choldgraf

listの場合、リストcompを使用できます。たとえば、3番目の要素なしでbaのコピーにするには:

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])

一般に、上記のリストの理解よりもはるかに高速です。

82
tom10
>>> 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]
>>> 

こちらもご覧ください

Pythonのスライス表記を説明する

46
Andreas Jung

私が見つけた最も簡単な方法は:

mylist[:x]+mylist[x+1:]

インデックスmylistの要素なしでxを生成します。

36
Andre Soares

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]
23
Abhijit

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]])
1
brnl

インデックスが事前にわからない場合は、ここで機能する関数があります

def reverse_index(l, index):
    try:
        l.pop(index)
        return l
    except IndexError:
        return False
0
aberger

上記の回答では、0ベースの除外は考慮されていません。

def exclude(lst, i):
    if i == 0:
        return lst[i+1:]

    return lst[:i] + lst[i+1:]
0
Ian