Индексировать все* кроме * одного элемента в python


есть ли простой способ индексировать все элементы списка (или массива, или что угодно) за исключением для конкретного индекса? Например,

  • mylist[3] вернет элемент в положение 3

  • milist[~3] вернет весь список, кроме 3

6 52

6 ответов:

на список, вы можете использовать список комп. Например, сделать b копия a без 3-го элемента:

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]

на включает в себя вы можете сделать это с помощью логического индексация:

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]

Если вы не знаете индекс заранее вот функция, которая будет работать

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