Индексировать все* кроме * одного элемента в python
есть ли простой способ индексировать все элементы списка (или массива, или что угодно) за исключением для конкретного индекса? Например,
mylist[3]
вернет элемент в положение 3milist[~3]
вернет весь список, кроме 3
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]